쉐이더란?
그래픽 파이프라인의 특정 단계에서 동작하여, 화면에 어떤 픽셀이 어떤 색으로 보일지 결정.
입체감을 위해 빛과 물체가 상호작용하여 색을 결정하는 것, 음영 처리하는 것.
(현재는 GPU 안에서 작동하는 프로그램으로 그 규모가 커졌다)
렌더링 파이프라인 단계에서 쉐이더단계들은 부분은 사용자가 설정하며 나머지는 알아서 처리해준다는 의미이다.
사용자가 그래픽을 더욱 제어하기 위해 다양한 쉐이더들이 추가되었다.
DX 에서는 HLSL 을 사용한다. API 별로 쉐이더 언어가 다르다.
Constants : 정점들이 같이 사용하는 공통 속성을 정의한다. 상수 버퍼와 의미가 흡사하다. (특정 거리만큼 이동 +1)
SRT 관련한 변수들을 전부 SRT 행렬 하나로 계산하여 최적화 할 수 있다.
struct Constants {
vec3 scale = vec3(1.0f);
vec3 translation = vec3(0.0f);
float rotationZ = 0.0f;
} constants;// g_constants
버텍스 쉐이더 : VS입력으로 VS 에 들어갈 값을 설정한다. VS출력 에서는 입력으로 들어온 값을 이용해 VS출력과 같은 형태로 반환한다. MyVertexShader 함수가 연산을 맡는다.
// 버텍스 쉐이더 (Vertex shader)
struct VSInput {
vec3 position;
vec3 color;
vec2 uv;
};
struct VSOutput {
vec3 position;
vec3 color;
vec2 uv;
};
VSOutput MyVertexShader(const VSInput vsInput) {
VSOutput vsOutput;
// 여기서 여러가지 변환 가능
vsOutput.position = vsInput.position;
vsOutput.color = vsInput.color;
vsOutput.uv = vsInput.uv;
return vsOutput;
}
픽셀 쉐이더 : 픽셀 단위로 작업하는 단위. 픽셀들의 색을 정해준다. 여러 색 규칙을 적용하는 단계. 특정 픽셀이 삼각형 안에 포함되어 색을 결정해야할 때 호출된다. Barycentric Coordinates 로 결정되는 정점의 특정 값(Color, uv 등등) 을 받아서 최종 색 연산을 진행한다.
// 픽셀 쉐이더 (Pixel shader)
struct PSInput {
vec3 color;
vec2 uv;
};
vec4 MyPixelShader(const PSInput psInput) {
// 여기서 픽셀의 색을 결정하기 위한 여러가지 규칙 적용
return vec4(psInput.color, 1.0f);
}
실습 예제에서는 UV 값을 변경 하는 것으로
vec4 MyPixelShader(const PSInput psInput) {
// 여기서 픽셀의 색을 결정하기 위한 여러가지 규칙 적용
if (psInput.uv.x < 0.5f)
{
return vec4(psInput.color, 1.0f);
}
else
{
return vec4(1.f, 1.f, 0, 1.0f);
}
}
다음과 같이 색삭 결정이 가능하다.

혹은 다음과 같이 정점들의 공통 속성을 조절하여
VSOutput MyVertexShader(const VSInput vsInput) {
VSOutput vsOutput;
// 여기서 여러가지 변환 가능
vsOutput.position =
RotateAboutZ(vsInput.position, constants.rotationZ);
vsOutput.color = vsInput.color;
vsOutput.uv = vsInput.uv;
return vsOutput;
}
다음과 같이 모든 정점에 특정 값을 조절할 수 있다.
