Shader "Unlit/WorldSpaceNormals"
{
// no Properties block this time!
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// include file that contains UnityObjectToWorldNormal helper function
#include "UnityCG.cginc"
struct v2f {
// we'll output world space normal as one of regular ("texcoord") interpolators
half3 worldNormal : TEXCOORD0;
float4 pos : SV_POSITION;
};
// vertex shader: takes object space normal as input too
v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
{
v2f o;
o.pos = UnityObjectToClipPos(vertex);
// UnityCG.cginc file contains function to transform
// normal from object to world space, use that
o.worldNormal = UnityObjectToWorldNormal(normal);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 c = 0;
// normal is a 3D vector with xyz components; in -1..1
// range. To display it as color, bring the range into 0..1
// and put into red, green, blue components
c.rgb = i.worldNormal*0.5+0.5;
return c;
}
ENDCG
}
}
}
노멀은 알록달록한 컬러를 만들어내는 것 외에도 모든 종류의 그래픽스 효과(조명, 반사, 실루엣 등등)에 사용됩니다.
위 셰이더에서는 Unity의 빌트인 셰이더 include 파일 중 하나를 사용하였습니다. 여기서는 유용한 함수인 UnityObjectToWorldNormal 을 포함하는 UnityCG.cginc 이 사용되었습니다. 또한 오브젝트 공간에서 화면으로 버텍스를 변환하는 유틸리티 함수 UnityObjectToClipPos 도 사용했습니다. 이렇게 하면 코드를 더 쉽게 읽을 수 있고 특정 상황에서 더 효율적입니다.
유니티는 ‘interpolators’(‘varyings’라고도 함)를 통해 데이터를 버텍스에서 프래그먼트 셰이더로 전달할 수 있다는 것을 확인했습니다. HLSL 셰이딩 언어에서는 일반적으로 TEXCOORDn 시맨틱으로 레이블이 지정되며 각각 최대 4개의 컴포넌트를 가진 벡터가 될 수 있습니다(자세한 내용은 셰이더에 버텍스 데이터 입력 페이지 참조).
또한 정규화된 벡터(–1.0부터 +1.0까지 범위)를 컬러로 시각화하는 방법에 대한 간단한 기법(벡터에 0.5를 곱하고 0.5를 더하기)을 배웠습니다. 더 많은 버텍스 데이터 시각화 예시는 버텍스 데이터 시각화를 참조하십시오.