셰이더라고 부르는 것은 무엇일까?
책에서 정의하는 바는 다음과 같다.
'3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수 혹은 알고리즘'
'3D에서 원래 Vertex의 위치를 변경하거나 재질의 색상에서 다른 색상으로 변경하는 모든 행위'
쉽게 말하자면 정점을 움직이거나 색의 농담, 색조, 명함 효과를 주는 주체라는 뜻이다.
이런 셰이더에는 CG, HLSL, GLSL 등의 언어가 존재한다.
셰이더는 렌더링 파이프라인의 대부분의 단계에서 사용이 된다.
1) Vertex Shader(정점 셰이더)
- 점 단위에서 연산을 하는 셰이더이다. 2D, 3D 모두 점, 선, 면으로 이루어질 수밖에 없는데, Vertex(점) 단위에서 x, y, z 좌표를 움직이거나, 색상을 바꾸는 등의 계산을 해주는 셰이더이다. 용례를 들자면 정점을 움직여, 물결을 치게 하거나, 나뭇잎을 흔들리게 하는 등의 예시가 있다.
2) Pixel Shader(Fragment Shader, 표면 셰이더)
- 픽셀 단위에서 연산을 하는 셰이더이다. 픽셀 셰이던는 Vertex Shader와 같이 공간상의 움직임을 연산할 수는 없다. 화면상에 렌더링 되는 각 픽셀의 색을 계산하고, 빛을 받거나, 그림자를 만드는 등의 계산을 하게 된다. 셰이더란 모니터에 어떻게 보이느냐에 대한 내용이므로, 대부분의 연산은 Pixel Shader에서 이뤄진다.
3) Geometry Shader
- Geometry Shader는 Vertex Shader에서는 할 수 없는 점이나, 선, 삼각형 등의 도형을 생성할 수 있는 기능이 있다.
- Geometry Shader 프로그램은 Vertex Shader가 수행되고 난 뒤에 수행된다. Geometry Shader 프로그램은 Vertex Shader를 거쳐온 도형 정보를 입력 받는데, 예를 들어 정점 세 개가 Geometry Shader에 들어오면, Shader는 정점을 모두 없앨 수도 있고 더 많은 도형을 만들어 내보낼 수도 있다. Geometry Shader를 지나간 도형 정보는 Rasterize를 거친 뒤 Pixel Shader를 통과하게 된다.
이런 셰이더를 이용하기 위해선 앞서 언급한 셰이딩 언어를 사용해야 하는데, DirecX에서 사용되는 언어는 hlsl이다.
hlsl을 이용해서 기본적인 셰이더 파일을 작성했다면 이를 컴파일 과정에서 컴파일러가 읽어들일 수 있어야한다.
하지만 컴파일은 cpp 파일을 읽어들이기 때문에 hlsl로 작성한 문서는 읽어들일 수가 없다. 때문에 별도로 셰이더를 컴파일러가 읽을 수 있게 cpp로 작성하는 과정을 거쳐야 한다.
class Shader
{
ID3D11VertexShader* vertexShader;
ID3D11PixelShader* pixelShader;
ID3D11InputLayout* vertexLayout;
public:
Shader();
~Shader();
void Set();
}
셰이더를 읽어들일 수 있는 클래스를 별도로 작성하였다. 멤버 변수들에 컴파일된 셰이더의 정보가 담길 것이고 이를 Set 함수를 통해 DeviceContext를 이용하여 렌더링 파이프라인에 바인딩 시킨다.
'프로그래밍 > 공부' 카테고리의 다른 글
[Game] 충돌 (0) | 2023.01.13 |
---|---|
[DirectX] 렌더링 파이프라인 - (2) (0) | 2023.01.06 |
[DirectX] 렌더링 파이프라인 - (1) (0) | 2023.01.04 |
[Game] 각도와 방향 (0) | 2023.01.01 |
[Game] 객체의 회전 part.2 (0) | 2022.12.22 |
댓글