복사

http://pusna25.blog.me/100187965288


셰이더의 종류:

  • 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 키워드:
    • C++의 typedef와 완전 동일 함.

 

변수 접두어:

  • static:
    • 변수 선언에 static 키워드를 이용하면 셰이더 외부에서 변수에 접근할 수 없음을 지정.
    • 다른 말로, 셰이더 내의 지역 변수로 이용.
    • static 키워드를 붙이면 함수가 처음 실행될 때 한번만 초기화되며 나머지 함수가 호출되는 동안 값을 유지한다.
    • 초기화하지 않으면 0으로 초기화된다.
  • uniform:
    • 변수가 셰이더 외부, 예를 들어 C++ 애플리케이션에서 초기화되어 셰이더에 입력됨을 의미.
  • extern:
    • 셰이더 외부에서 변수에 접근할 수 있음을 의미.
    • 전역 변수만이 extern 키워들 가질 수 있다.
    • static이 아닌 전역 변수는 디폴트로 extern이다.
  • shared:
    • 이펙트 프레임웍에게 변수가 다수의 효과에 공유될 것임을 알린다.
    • 전역 변수만이 shared 키워드를 가진다.
  • volatile:
    • 이펙트 프레임웍에게 변수가 자주 수정될 것임을 알린다.
    • 전역 변수만이 volatile 키워드를 가진다.
  • const:
    • C++과 동일함.

 


반응형

+ Recent posts