일반적인 노말맵 적용 방식을 사용하면 에러가 난다.
그 이유는 '버텍스 월드 노말'과 '탄젠트 노말인 UnpackNormal 함수를 거친 노말'을
surf 함수 내부에서 같이 사용하였기 때문이다.
따라서 좌표계를 월드로 통일하여 계산한다.
코드
Shader "Custom/part15-2"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_BumpMap ("NormalMap", 2D) = "bump" {}
_Cube ("Cubemap", Cube) = ""{}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert noambient
#pragma target 3.0
sampler2D _MainTex;
sampler2D _BumpMap;
samplerCUBE _Cube;
struct Input
{
float2 uv_MainTex;
float2 uv_BumpMap;
float3 worldRefl;
INTERNAL_DATA // 버텍스 노말 데이터를 픽셀 노말 데이터로 변환하기 위한 행렬들이 가동된다.
};
UNITY_INSTANCING_BUFFER_START(Props)
// put more per-instance properties here
UNITY_INSTANCING_BUFFER_END(Props)
void surf (Input IN, inout SurfaceOutput o)
{
o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); // 아래에서 o.Normal을 사용하기에, 여기서 노말 연산한다.
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
float4 re = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal)); // 노말맵이 적용된 픽셀 월드 노말을, UV로 사용한다.
o.Albedo = c.rgb * 0.5;
o.Emission = re.rgb * 0.5;
o.Alpha = c.a;
}
ENDCG
}
FallBack "Diffuse"
}
추가정보
탄젠트 좌표계의 노말
월드 좌표계의 버텍스, 픽셀 노말을 보는 법
'셰이더 (Shader) > 유니티 쉐이더 스타트업 - 정종필' 카테고리의 다른 글
[Unity/Shader] 파트16-2 : 반투명 (알파 블렌드 Alpha Blend) (0) | 2023.08.23 |
---|---|
[Unity/Shader] 파트16-1 : Z 버퍼 (0) | 2023.08.23 |
[Unity/Shader] 파트15-1 : Cubemap 적용 (0) | 2023.08.22 |
[Unity/Shader] 파트14-8 : Diffuse Wraping 기법 응용 (0) | 2023.08.22 |
[Unity/Shader] 파트14-7 : Diffuse Wraping 기법 (1) | 2023.08.22 |
댓글