struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 worldRefl;
INTERNAL_DATA
};
sampler2D _MainTex;
sampler2D _BumpMap;
samplerCUBE _Cube;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb * 0.5;
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
o.Emission = texCUBE (_Cube, WorldReflectionVector (IN, o.Normal)).rgb;
}
Unity5에서 Reflection 처리는 WorldRefl으로 처리되나 Normal과 같이 사용시에서는
texCUBE(_Cube, IN.worldRefl).rgb로 선언할 경우 출력이 되지 않는다. 유니티 홈페이지에서 설명하는 내용은
float3 worldRefl - Surface Shaders이 o.Normal에 기입하지 않는 경우 월드 반사 벡터를 포함합니다. 반사 - 디퓨즈 쉐이더를 참조하십시오.
float3 worldNormal - Surface Shaders이 o.Normal에 기입하지 않는 경우 월드 법선 벡터를 포함합니다.
float3 worldRefl; INTERNAL_DATA - Surface Shaders이 o.Normal에 쓸 경우 월드 반사 벡터를 포함합니다. 픽셀 당 법선 맵에 기초하여, 반사 벡터를 얻으려면 WorldReflectionVector(IN, o.Normal)를 사용합니다. 반사-범프 형 쉐이더(Reflect-Bumped shader)를 참조하십시오.
float3 worldNormal; INTERNAL_DATA - _Surface Shaders가 o.Normal에 쓰는 경우 _ 월드 반사 벡터를 포함합니다. 픽셀 당 법선맵에 기초하며, 법선 벡터를 얻으려면 WorldNormalVector (IN, o.Normal)를 사용합니다.
이 때문에 WorldReflectionVector를 사용하는데 여기서 struct Input에 선언되는 INTERNAL_DATA는 픽셀당 반사 벡터를 사용하기 위해 셰이더 컴파일단계에서 디버그 체크를 위해 선언하는 모양..
Unity4에서는 이게 문제가 되지 않았는데 5에서 PBR로 바뀌면서 이런식으로 cube 맵 사용이 변경되었다.
>> 대마왕님 이야기로는 Unity4에서도 이렇게 사용해야 했다고 함.. (왜 기억이 안나지..;;;)
WorldReflectionVector (IN, o.Normal) 구문을 조금만 바꿔주면 frenel처럼 사용도 가능~
'Technical Report > Unity Shader' 카테고리의 다른 글
Unity Alpha Blend togle mode shader (0) | 2016.05.24 |
---|---|
Unity Alpha Blend Mode Toggle (0) | 2016.05.23 |
Shader #pragma 파라메터 역할 (0) | 2016.04.01 |
Unity 서피스 셰이더에서 discard나 return을 사용할때 주의할 점 (0) | 2016.03.20 |
Unity Built-in shader variables (0) | 2015.11.24 |