본문 바로가기

DX

쉐이더 개념

쉐이더란?

 

그래픽 파이프라인의 특정 단계에서 동작하여, 화면에 어떤 픽셀이 어떤 색으로 보일지 결정.

입체감을 위해 빛과 물체가 상호작용하여 색을 결정하는 것, 음영 처리하는 것.

(현재는 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;
}

 

다음과 같이 모든 정점에 특정 값을 조절할 수 있다.

 

'DX' 카테고리의 다른 글

원근 투영 실습  (0) 2025.04.30
뒷면 제거  (0) 2025.04.30
깊이 버퍼  (0) 2025.04.30
그림자 표현  (0) 2025.03.31
원근 투영을 이용한 물체 표현  (0) 2025.03.31