목차
Providing vertex data to vertex programs
Cg vertex programs을 위해서 꼭지점 데이터는 하나의 구조로서 패스되어야 합니다. 몇몇의 공통적으로 사용되는 꼭지점의 구조는 UnityCG.cginc
include 파일에 정의되어 있고 대부분의 경우에 그것들을 사용하기에 충분합니다. 구조는 다음과 같습니다:
appdata_base
: 꼭지점은 위치, normal 그리고 하나의 텍스쳐 좌표로 이루어 집니다.appdata_tan
: 꼭지점은 위치, 탄젠트, normal 그리고 하나의 텍스쳐 좌표로 이루어 집니다.
예를 들어 이 쉐이더는 그것의 normals에 기반해서 메쉬의 색을 칠하고 꼭지점 프로그램 입력으로 appdata_base
사용합니다:
Shader "VertexInputSimple" { SubShader { Pass { CGPROGRAM #pragma vertex vert #include "UnityCG.cginc" struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; v2f vert (appdata_base v) { v2f o; o.pos = mul (UNITY_MATRIX_MVP, v.vertex); o.color.xyz = v.normal * 0.5 + 0.5; return o; } ENDCG } } }
사용자가 다른 꼭지점 데이터에 접근하기를 원한다면 사용자는 꼭지점 구조를 스스로 선언해야만 합니다. 구조 _members_ 다음의 리스트로부터 와야 합니다:
float4 vertex
는 꼭지점 위치 입니다float3 normal
은 꼭지점 normal 입니다float4 texcoord
는 첫 번째 UV 좌표 입니다float4 texcoord1
은 두 번째UV 좌표 입니다float4 tangent
는 탄젠트 벡터 입니다 (normal 매핑을 위해 사용되는).float4 color
는 정점당 색상입니다
Examples
Visualizing UVs
다음의 쉐이더 예들은 꼭지점 쉐이더 입력으로서 (구조appdata
에서 정의된) 꼭지점 위치와 첫 번째 텍스쳐 좌표를 사용합니다. 메쉬의 UV 좌표를 디버그하는데 매우 유용합니다. UV 좌표는 빨강 그리고 녹색으로 시각화되고 0…1 범위 밖의 좌표는 적용된 옅은 추가적인 파랑색을 가집니다.
Shader "!Debug/UV 1" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert #pragma fragment frag // vertex input: position, UV struct appdata { float4 vertex : POSITION; float4 texcoord : TEXCOORD0; }; struct v2f { float4 pos : SV_POSITION; float4 uv : TEXCOORD0; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); o.uv = float4( v.texcoord.xy, 0, 0 ); return o; } half4 frag( v2f i ) : COLOR { half4 c = frac( i.uv ); if (any(saturate(i.uv) - i.uv)) c.b = 0.5; return c; } ENDCG } } }
유사하게 이 쉐이더는 모델의 두 번째 UV 세트를 시각화합니다:
Shader "!Debug/UV 2" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert #pragma fragment frag // vertex input: position, second UV struct appdata { float4 vertex : POSITION; float4 texcoord1 : TEXCOORD1; }; struct v2f { float4 pos : SV_POSITION; float4 uv : TEXCOORD0; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); o.uv = float4( v.texcoord1.xy, 0, 0 ); return o; } half4 frag( v2f i ) : COLOR { half4 c = frac( i.uv ); if (any(saturate(i.uv) - i.uv)) c.b = 0.5; return c; } ENDCG } } }
Visualizing vertex colors
다음의 쉐이더는 꼭지점 쉐이더 입력으로서 (appdata
구조에 정의된) 꼭지점의 위치와 정점당 색상을 사용합니다.
Shader "!Debug/Vertex color" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert // vertex input: position, color struct appdata { float4 vertex : POSITION; float4 color : COLOR; }; struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); o.color = v.color; return o; } ENDCG } } }
Visualizing normals
다음의 쉐이더는 꼭지점 쉐이더의 입력으로 (appdata
구조에 정의된) 꼭지점 위치와 normal을 사용합니다. Normal’s X,Y,Z 컴포넌트는 R, G, B 색으로 시각화 됩니다. Normal 컴포넌트가 -1과 1 사이에 있기 때문에 우리는 그들을 스케일하고 결과 색상이 0…1 범위에서 보여질 수 있도록 한쪽으로 치우치게 합니다.
Shader "!Debug/Normals" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert // vertex input: position, normal struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); o.color.xyz = v.normal * 0.5 + 0.5; o.color.w = 1.0; return o; } ENDCG } } }
모델에 적용되는 디버그 Normals 쉐이더. 사용자는 모델이 음영의 모서리를 가지는 것을 볼 수 있습니다 .
Visualizing tangents and binormals
탄젠트와 binormal 벡터는 normal 매핑을 위해서 사용됩니다. Unity에서 오직 탄젠트 벡터가 꼭지점에서 저장되고 binormal은 normal과 탄젠트로부터 파생됩니다.
다음의 쉐이더는 꼭지점 쉐이더의 입력으로서 (appdata
구조에 정의된) 꼭지점 위치와 탄젠트를 사용합니다. 탄젠트의X,Y,Z 컴포넌트는 R, G, B 색으로 시각화 됩니다. Normal 컴포넌트가 -1과 1 사이에 있기 때문에 우리는 그들을 스케일하고 결과 색상이 0…1 범위에서 보여질 수 있도록 한쪽으로 치우치게 합니다.
Shader "!Debug/Tangents" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert // vertex input: position, tangent struct appdata { float4 vertex : POSITION; float4 tangent : TANGENT; }; struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); o.color = v.tangent * 0.5 + 0.5; return o; } ENDCG } } }
다음의 쉐이더는 binormals를 시각화 합니다. 그것은 꼭지점의 입력으로서 꼭지점 위치, normal 그리고 탄젠트를 사용합니다. Binormal은 normal과 탄젠트로부터 계산됩니다. Normal 또는 탄젠트처럼 그것은 스케일될 필요가 있고 디스플레이 될 수 있도록 0…1의 범위로 치우쳐질 필요도 있습니다.
Shader "!Debug/Binormals" { SubShader { Pass { Fog { Mode Off } CGPROGRAM #pragma vertex vert // vertex input: position, normal, tangent struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float4 tangent : TANGENT; }; struct v2f { float4 pos : SV_POSITION; float4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.pos = mul( UNITY_MATRIX_MVP, v.vertex ); // calculate binormal float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w; o.color.xyz = binormal * 0.5 + 0.5; o.color.w = 1.0; return o; } ENDCG } } }
모델에 적용된 디버그Binormals 쉐이더. 예쁩니다 !
- 출처: 유니티코리아위키 (CC BY-NC-SA 2.0)