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
    }
}
}


원환체 매들 모델에 적용된 디버그 UV1 쉐이더

유사하게 이 쉐이더는 모델의 두 번째 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 쉐이더. 예쁩니다 !

역링크