Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[CG/Unity] Vertex Shader 본문

CG/Unity

[CG/Unity] Vertex Shader

scii 2022. 1. 30. 23:49
CGPROGRAM
#pragma suface surf Lambert vertex:vert

void vert(inout appdata_full v){
    // y축으로 1m 만큼 이동
    v.vertex.y += 1;
}

vertex:vert로 버텍스 셰이더가 vert라는 함수 이름으로 시작된다는 것을 #pragma에서 알려주고, void로 시작하는 vert이름의 함수를 만든다.

appdata_full이 보인다. 이것은 surf 함수에서 사용했떤 SurfaceOutputStandard처럼, UnityCG.cginc 파일 안에 미리 선언되어 있는 특정한 구조체이다. 이 구조체는 버텍스가 가지고 있는 정보를 구조체로 만든 것이며, 이 구조체를 메뉴얼에서 찾아보면 다음과 같이 설명하고 있다.

  • appdata_base: position, normal and one texture coordinate.
    • 위치, 노멀과 하나의 텍스처 좌표계
  • appdata_tan: position, tangent, normal and one texture coordinate.
    • 위치, 탄젠트, 노멀과 하나의 텍스처 좌표계
  • appdata_full: position, tangent, normal, four texture coordinates and color.
    • 위치, 탄젠트, 노멀, 4개의 텍스처 좌표계와 버텍스 컬러

즉, 필요에 의해서 위 3가지 중 하나를 선택해서 사용하면 된다. 당연히 작은 것을 선택할수록 가볍다. 그리고 저 구조체를 UnityCG.cginc에서 검색해 보면 다음과 같은 구조체가 정의되어 있음을 알 수 있다.

struct appdata_base {
    float4 vertex : POSITION;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};


struct appdata_tan {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};


struct appdata_full {
    float4 vertex : POSITION;
    float4 tangent : TANGENT;
    float3 normal : NORMAL;
    float4 texcoord : TEXCOORD0;
    float4 texcoord1 : TEXCOORD1;
    float4 texcoord2 = TEXCOORD2;
    float4 texcoord3 = TEXCOORD3;
    fixed4 color : COLOR;
    UNITY_VERTEX_INPUT_INSTANCE_ID
};

그러므로 저 구조체들 안에 정의되어 있는 아래 변수들을 가져다 쓸 수 있다.

  • float4 vertex : POSITION - 버텍스의 위치를 나타낸다.
  • float4 tangent : TANGENT - 접선 방향(NormalMap 연산할 때 주로 사용하는 축)을 나타낸다.
  • float3 normal : NORMAL - 버텍스의 노멀을 나타낸다.
  • float4 texcoord : TEXCOORD0 - 첫 번째 UV 좌표를 의미한다.
  • float4 texcoord1 : TEXCOORD1 - 두 번째 UV 좌표를 의미한다. 라이트맵용 커스텀 UV 데이터를 사용할 때 많이 사용한다.
  • float4 texcoord2 : TEXCOORD2 - 세 번째 UV 좌표를 의미한다. 특별한 경우에 사용된다.
  • float4 texcoord3 : TEXCOORD3 - 네 번째 UV 좌표를 의미한다. 특별한 경우에 사용된다.

 

사실상 3D 프로그램에서 유니티로 넘길 때, UV는 두 개까지만 넘어온다. 그럼에도 불구하고 버텍스는 UV 데이터를 4개까지 가질 수 있기 때문에, 3번째와 4번째는 평범한 float4처럼 자유롭게 응요되어 사용되는 경우가 많다.

해당 vert함수를 비워 놓아도 아무 문제가 없다. 원칙적으로 셰이더에서 버텍스 셰이더의 기본 기능은 "좌표의 변환" 이다.

원래 셰이더에서는 버텍스 셰이더에서 "Local(오브젝트) 좌표계 --> World(모델) 좌표계 --> Camera(View) 좌표계 --> Projection 좌표계" 라는 변환을 거치는 작업을 하지 않으면 오브젝트가 모니터에 보이는 것 자체가 불가능하다.

그런데 유니티의 서피스 셰이더에 있는 버텍스 셰이더는 '필요가 없으면' 안 써도 알아서 자동 변환을 해 준다. 즉. '필요할 때' '필요한 것만' 가져다 쓰면 되기 때문에 매우 편리하다.

 

'CG > Unity' 카테고리의 다른 글

[CG/Unity] Diffuse Warping  (0) 2022.02.01
[CG/Unity] Toon Shader  (0) 2022.02.01
[CG/Unity] Lambert 셰이더  (0) 2022.01.16
[CG/Unity] Custom Light 만드는 방법  (0) 2022.01.15
[CG/Unity] 유니티 셰이더의 작성 방법  (0) 2021.11.14
Comments