본문으로 바로가기
반응형

 




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처럼 사용도 가능~

반응형