셰이더의 종류: - HLSL: DirectX에서 사용하는 셰이더 언어.
- GLSL: OpenGl Shader Language의 약자로, OpenGL에서 지원하는 셰이더 언어. HLSL과 문법이 조금 다름.
- CgFX: 엔비디아에서 지원하는 셰이더 언어로 HLSL과 거의 동일함.
HLSL(High-Level Shading Languae): - 고수준 셰이딩 언어.
- 버텍스와 픽셀 셰이더는 고정 기능 파이프라인을 대체하는 작은 커스텀 프로그램.
- 그래픽 카드의 GPU에서 실행된다.
- 간단히 말해서, 화면에 존재하는 각 픽셀의 위치와 색상을 계산하는 함수.
정점 셰이더(vertex shader): - 3D 물체를 구성하는 정점들의 위치를 화면 좌표로 변환하는 것.
픽셀 셰이더(pixel shader): 간략하게 만든 3D 파이프라인: - 정점 데이터(위치 등)->정점 셰이더(정점 위치)->레스터라이저(픽셀 위치)->픽셀 셰이더(색상)->화면.
HLSL 셰이더의 컴파일: - 상수 테이블:
- 모든 셰이더는 내부의 변수를 보관하기 위한 상수 테이블을 가지고 있으며, D3DX 라이브러리는 애플리케이션이 셰이더의 상수 테이블에 접근할 수 있도록 하는 ID3DXConstantTalbe 인터페이스를 제공한다.
- 즉, 이 인터페이스를 이용하면 애플리케이션(VS) 코드에서 셰이더 소스 코드 내의 변수 값을지정할 수 있다.
- 상수로의 핸들 얻기:
- 애플리케이션 코드에서 셰이더의 특정 변수를 지정하기 위해서는 먼저 변수를 참조 하는 방법이 필요하며, 이를 위해 D3DXHANDLE이 이용된다.
- ID3DXConstantTalbe::GetConstantByName()이란 함수로 핸들을 얻는다.
- 상수 값 설정하기:
- 셰이더 코드 내의 변수를 연결하는 D3DXHANDLE을 얻은 다음에는 ID3DXConstantTalbe::SetXXX 메서드를 이용해 애플리케이션에서 셰이더의 변수 값을 지정할 수 있다.
- 여기에서 XXX는 지정하려는 지정하려는 변수의 형을 의미하는 형 이름으로 대체된다. ex) SetFloat, SetBool 등...
SetXXX() 함수: - SetBool():
- 불 값을 지정.
- bool b = true;
- SetBool(Device, handle, b);
- SetBoolArray():
- 불 배열의 값을 지정.
- bool b[3] = { true, false, true };
- SetBoolArray(Device, handle, b, 3);
- SetFloat():
- 부동 소수 값을 지정.
- float f = 3.14f;
- SetFloat(Device, handle, f);
- SetFloatArray():
- 부동 소수 배열의 값을 지정.
- float f[2] = { 1.0f, 2.0f };
- SetFloatArray(Device, handle, f, 2);
- SetInt():
- 정수 값을 지정.
- int x = 4;
- SetInt(Device, handle, x);
- SetIntArray():
- 정수 배열의 값을 지정.
- int x[4] = { 1,2,3,4 };
- SetIntArray(Device, handle, x, 4);
- SetMatrix():
- 4x4 행렬의 값을 지정.
- D3DXMATRIX M(...);
- SetMatrix(Device, handle, &M);
- SetMatrixArray():
- 4x4 행렬 배열의 값을 지정.
- D3DXMATRIX M[4];
- ... 행렬 초기화.
- SetMatrixArray(Device, handle, M, 4);
- SetMatrixPointerArray():
- 4x4 행렬 포인터의 배열 값을 지정.
- D3DXMATRIX* M(...);
- ... 행렬 포인터를 할당하고 초기화.
- SetMatrixPointerArray(Device, handle, M, 4);
- SetMatrixTranspose():
- 전치 4x4 행렬의 값을 지정.
- D3DXMATRIX M(...);
- D3DXMatrixTranspose(&M, &M);
- SetMatrixTranspose(Device, handle, &M);
- SetMatrixTransposeArray():
- 전치 4x4 행렬의 배열 값을 지정.
- D3DXMATRIX M[4];
- ... 행렬을 초기화하고 전치.
- SetMatrixTransposeArray(Device, handle, M, 4);
- SetMatrixTransposePointerArray():
- 4x4 전치 행렬의 포인터 배열 값을 지정.
- D3DXMATRIX* M[4];
- ... 행렬 포인터를 할당, 초기화하고 전치.
- SetMatrixTransposePointerArray(Device, handle, M, 4);
- SetVector():
- D3DXVECTOR4 형 변수의 값을 지정.
- D3DXVECTOR4 v(1.0f, 2.0f, 3.0f, 4.0f);
- SetVector(Device, handle, &v);
- SetVectorArray():
- 벡터 배열의 변수 값을 지정.
- D3DXVECTOR4 v[3];
- ... 벡터를 초기화.
- SetVectorArray(Device, handle, v, 3);
- SetValue():
- 구조체와 같이 임의의 크기를 가진 형의 값을 지정.
- D3DXMATRIX M(...);
- SetValue(Device, handle, (void*)&M, sizeof(M));
- 위에서는 D3DXMATRIX 값을 지정하는 데 사용함.
- SetDefaults():
- 상수의 디폴트 값 지정.
- SetDefaults(Device);
변수 형: - 스칼라 형:
- bool: True, False 값. HLSL은 True와 False 키워드를 제공.
- int: 32비트 부호 정수.
- half: 16비트 부동 소수점 수.
- float: 32비트 부동 소수점 수.
- double: 64비트 부동 소수점 수.
- 벡터 형:
- vector: float 성분을 가지는 4D 벡터.
- vecot<T, n>: n-차원의 벡터. 각각의 성분은 T형의 스칼라이다. 차원 n은 반드시 1~4내에 있어야 한다.
- ex) vector<double, 2> vec2;
- float2 vec2; // 2D 벡터.
- float3 vec3; // 3D 벡터.
- float4 vec4; // 4D 벡터. 처럼 미리 정의된 형을 이용할 수 있다.
- 행렬 형:
- matrix: 4x4 행렬. 각 항목은 float이다.
- matirx<T, M, n>: m*n행렬. T는 스칼라형.
- 배열:
- float M[4][4];
- half p[4];
- vector v[12];
- 구조체:
- C++와 다르게 HLSL 구조체는 멤버함수를 가질 수 없다는 거 말고 동일함.
- typedef 키워드:
변수 접두어: - static:
- 변수 선언에 static 키워드를 이용하면 셰이더 외부에서 변수에 접근할 수 없음을 지정.
- 다른 말로, 셰이더 내의 지역 변수로 이용.
- static 키워드를 붙이면 함수가 처음 실행될 때 한번만 초기화되며 나머지 함수가 호출되는 동안 값을 유지한다.
- 초기화하지 않으면 0으로 초기화된다.
- uniform:
- 변수가 셰이더 외부, 예를 들어 C++ 애플리케이션에서 초기화되어 셰이더에 입력됨을 의미.
- extern:
- 셰이더 외부에서 변수에 접근할 수 있음을 의미.
- 전역 변수만이 extern 키워들 가질 수 있다.
- static이 아닌 전역 변수는 디폴트로 extern이다.
- shared:
- 이펙트 프레임웍에게 변수가 다수의 효과에 공유될 것임을 알린다.
- 전역 변수만이 shared 키워드를 가진다.
- volatile:
- 이펙트 프레임웍에게 변수가 자주 수정될 것임을 알린다.
- 전역 변수만이 volatile 키워드를 가진다.
- const:
|