본문 바로가기
셰이더 (Shader)/셰이더 프로그래밍 입문 - Pope Kim (완)

[HLSL] 챕터2 - 진짜 쉬운 빨강셰이더

by Minkyu Lee 2023. 3. 18.

정점 셰이더

float4x4 gWorldMatrix;
float4x4 gViewMatrix;
float4x4 gProjectionMatrix;

struct VS_INPUT
{
   float4 mPosition : POSITION;
};

struct VS_OUTPUT
{
   float4 mPosition : POSITION;
};

VS_OUTPUT vs_main(VS_INPUT Input)
{
   VS_OUTPUT Output;
   Output.mPosition = mul(Input.mPosition, gWorldMatrix);
   Output.mPosition = mul(Output.mPosition, gViewMatrix);
   Output.mPosition = mul(Output.mPosition, gProjectionMatrix);
   
   return Output;
}

// 전역변수 vs 정점 데이터

모든 정점이 동일한 값 사용하느냐의 여부로 구분된다.

동일하다면 전역변수다.

 

// 시맨틱

정점의 위치를 입력 받아야한다.

Direct X의 정점버퍼로부터 시맨틱을 통해 받을 수 있다.

POSITION이라는 시맨틱을 통해 입력 받는다.

 

필요한 정보를 빼오는 것을 시맨틱이라고 한다.

 

float4 mPosition: POSITION; 의 의미는 위치 정보를 가져와 대입하라라는 명령이다.

 

// 위치변환 필수

위치 변환 결과를 래스터 라이저에 전달해줘야만 한다.

따라서 반드시 위치변환 결과를 반환해야한다.

 

  • 공간변환

// 물체공간 (지역공간, object space, local space)

각 물체가 가지는 자신만의 좌표계이다.

 

// 월드공간

두 개 이상의 물체를 통일적으로 처리하기 위한 공간이다.

 

// 뷰 공간

카메라가 사용하는 공간을 의미한다.

원점은 카메라 렌즈의 정중앙이다.

정중앙으로부터 오른쪽, 위쪽, 앞쪽 3개의 축을 만든다.

 

// 투영공간

원근을 반영한다.

인간의 시야처럼 만든다.

투시법을 적용한다.

 

// 정리

행렬 3개를 구해야한다.

각 공간의 원점과 세 축을 알면 그 공간을 나타내는 행렬을 만들 수 있다.

모든 행렬은 전역변수로 선언한다.

 

물체 공간 -> 월드공간 -> 뷰공간 -> 투영공간

위 변환에서 월드행렬, 뷰 행렬, 투영행렬이 순차적으로 사용된다.

 

  • 기타

// mul 함수

HLSL의 내장함수이다.

여러 데이터형 간의 곱셈을 처리해준다.

위 코드에서는 행렬과 벡터의 곱셈을 처리하였다.

 

픽셀 셰이더

float4 ps_main() : COLOR
{   
   return( float4( 1.0f, 0.0f, 0.0f, 1.0f ) );
   
}

픽셀의 색을 빨간색으로 반환한다.

 

// : COLOR의 의미 (ps_main의 헤더부분)

ps_main 함수의 반환값을 백버퍼의 색상값으로 처리한다.

댓글