본문 바로가기
Unity/Solution

Unity URP에서 Built-in Shader 변수를 사용할 때 발생하는 오류 및 해결 방법

by Dev_카페인 2025. 2. 8.
반응형

Unity URP에서 Built-in Shader 변수를 사용할 때 발생하는 오류 및 해결 방법

 

🚀 개요

Unity에서 Built-in Render Pipeline(BRP)Universal Render Pipeline(URP)은 렌더링 방식이 다릅니다.
따라서, Built-in에서 사용되던 일부 쉐이더 변수는 URP에서 지원되지 않으며, 이를 그대로 사용하면 컴파일 오류가 발생할 수 있습니다.

이번 포스트에서는 unity_SpecCube0_BoxMax 관련 오류를 해결하는 과정을 설명합니다.

 

1. 오류 발생 상황

유니티에서 다음 에셋을 사용하기 위해 임포트를 진행했지만 문제가 발생했습니다.

 

Poly Planets | 3D | Unity Asset Store

Elevate your workflow with Poly Planets asset from Alex Merqury. Find this & other great 3D options on the Unity Asset Store.

assetstore.unity.com

분홍색 머티리얼은 매번 나타나는 문제이지만 외부의 쉐이더 코드에 문제가 있을 경우 해결하기가 까다롭습니다.

 

URP 환경에서 아래와 같은 쉐이더 코드를 사용하면 오류가 발생합니다.

d.boxMax[0] = unity_SpecCube0_BoxMax;
d.boxMin[0] = unity_SpecCube0_BoxMin;
d.probePosition[0] = unity_SpecCube0_ProbePosition;
d.probeHDR[0] = unity_SpecCube0_HDR;

🔻 오류 메시지 예시 (D3D11에서 컴파일 실패)

undeclared identifier 'unity_SpecCube0_BoxMax' at line XX (on d3d11)
or
invalid subscript 'boxMax' at line XX (on d3d11)

이 오류가 발생하는 이유는 URP에서는 unity_SpecCube0_BoxMax 변수를 지원하지 않기 때문입니다.


2. 오류 원인 분석

🔍 unity_SpecCube0_* 변수란?

Built-in Render Pipeline에서는 Reflection Probe(반사 프로브)를 샘플링할 때,
Box Projection(박스 프로젝션) 데이터를 unity_SpecCube0_* 변수에 자동으로 저장합니다.

변수명역할

unity_SpecCube0_BoxMax Reflection Probe의 박스 최대 좌표
unity_SpecCube0_BoxMin Reflection Probe의 박스 최소 좌표
unity_SpecCube0_ProbePosition Reflection Probe의 중심 좌표
unity_SpecCube0_HDR Reflection Probe의 HDR 데이터

하지만 URP에서는 해당 변수를 제공하지 않습니다.
URP는 Reflection Probe를 샘플링하는 다른 방식을 사용하므로, 위 변수를 그대로 사용하면 컴파일 오류가 발생합니다.


3. 해결 방법

 방법 1: 그래픽 설정에서 Reflection probes box projection를 체크

프로젝트 설정에서 그래픽 설정에 들어갑니다.

Tier 1에 있는 기본 값 사용을 체크 해제하고 Reflection probes box projection를 체크합니다.

이후에도 변화가 없다면 Tier 2 또는 Tier 3까지 체크하여 변화를 살핍니다.

Edit-> Project Settings → Graphics.

 

방법 2: unity_SpecCube0_* 변수를 제거하고 URP 전용 방식 사용

URP에서는 unity_SpecCube0_* 변수를 사용할 수 없으므로 Reflection Probe를 직접 샘플링해야 합니다.

🔹 기존 Built-in 방식 (오류 발생 코드)

// Built-in Render Pipeline 전용 코드
d.boxMax[0] = unity_SpecCube0_BoxMax;
d.boxMin[0] = unity_SpecCube0_BoxMin;
d.probePosition[0] = unity_SpecCube0_ProbePosition;
d.probeHDR[0] = unity_SpecCube0_HDR;

🔹 URP 전용 코드로 수정

URP에서는 UNITY_DECLARE_TEXCUBE와 SAMPLE_TEXTURECUBE_LOD를 사용하여 Reflection Probe를 직접 샘플링합니다.

// ✅ URP에서 Reflection Probe 샘플링 방법
UNITY_DECLARE_TEXCUBE(_GlobalEnvMap);
SAMPLER(sampler_GlobalEnvMap);

float3 reflectionVector = reflect(-d.worldViewDir, normalDirection);
float3 reflectionColor = SAMPLE_TEXTURECUBE_LOD(_GlobalEnvMap, sampler_GlobalEnvMap, reflectionVector, 0.0).rgb;

이제 URP에서도 Reflection Probe를 올바르게 사용할 수 있습니다! 🚀

실제로 테스트해보지 않은 코드입니다.


4. 정리 및 결론

🔥 🚀 주요 해결 방법 요약

문제해결 방법

unity_SpecCube0_BoxMax 등의 변수가 정의되지 않음 그래픽 셋팅에서 Reflection probes box projection를 체크
unity_SpecCube0_BoxMax 등의 변수가 URP에서 정의되지 않음 해당 변수를 제거하고 Reflection Probe를 직접 샘플링
TEXTURECUBE(_ReflectionProbe); 오류 발생 URP에서는 UNITY_DECLARE_TEXCUBE를 사용해야 함
SAMPLE_REFLECTION_PROBE 사용 불가 URP에서는 SAMPLE_TEXTURECUBE_LOD를 사용해야 함

결론

  • Built-in Render Pipeline과 URP의 차이를 이해하는 것이 중요합니다.
  • URP에서는 기존 Built-in 변수를 사용할 수 없으므로, URP에 맞는 반사 프로브 샘플링 방식을 사용해야 합니다.
  • 위 방법을 적용하면 URP에서도 정상적으로 Reflection Probe를 사용할 수 있습니다.


📌 추가적으로 궁금한 점이 있나요?

쉐이더 관련 문제나 최적화, URP 전환 과정에서 어려운 점이 있다면 언제든지 질문하세요! 🎮 🚀

 

 

이와 같은 문제를 가진 사람이 있었습니다.

https://discussions.unity.com/t/unity-shader-invalid-subscript-boxmax

 

 

 

 

 

반응형