헤더파일
셰이더 공부 - Color Shader 본문
글의 내용은 포프 김이 지은 셰이더프로그램 입문을 정리한 것에 불과합니다. 작성한 코드는 hlsl이므로 실제 결과를 보기위해서
따로 만든 DirectX 프레임워크가 필요합니다.(렌더몽키란 프로그램으로 연습하는 것도 좋습니다.)
셰이더에서 사용할 수 있는 입력 값으로는 전역변수와 정점데이터가 있다.
이 둘을 구분하는 기준은 한 물체를 구성하는 모든 정점이 동일한 값을 사용하느냐의 여부입니다.
만약 동일한 값을 이용한다면 전역변수가 되어야 하고 아니면 정점데이터의 일부로 값을 받아야 합니다.
1)정점셰이더
1.정점데이터
정점셰이더에서 입력받을 데이터는 주로 구조체형식으로 만듭니다.
struct VS_INPUT
{
float4 mPosition : POSITION;
}
지금은 입력데이터가 하나지만 나중에는 여러개가 될 수 있는데 mPosition이 정점이라는 것을 알 수 있는 것은 POSITION 이라는 시멘틱 때문입니다.
정점셰이더의 출력데이터도 구조체로 선언합니다.
struct VS_OUTPUT
{
float4 mPosition : POSITION;
}
각 픽셀의 위치를 찾아내려면 정점셰이더가 위치변환 결과를 래스터라이저에 전달해 줘야만 합니다. 따라서 정점셰이더는 반드시 위치변환 결과를 반환해야 합니다.
역시 mPosition 변수에 POSITION이라는 시멘틱을 써서 위치라는걸 알려줬습니다.
2.전역 변수
정점셰이더에 꼭 필요한 전역변수에는 3D 공간변환에 필요한 행렬을 받아오는 것입니다.
물체공간에서 월드 공간으로 변환시켜줄 월드 행렬
월드공간에서 뷰공간으로 변환시켜줄 뷰행렬
뷰공간에서 투영공간으로 변환시켜줄 투영행렬
float4x4자료형 변수로 3개의 행렬 변수를 만들어줍니다.
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;
}
2)픽셀셰이더
픽셀셰이더의 가장 중요한 임무는 픽셀의 색을 반환하는 것입니다. 빨간색을 반환하고 싶으면
return float4(1.0f, 0.0f, 0.0f, 1.0f);
이런식으로 float4 형 변수를 반환하면 됩니다.
빨간색을 255 , 0 , 0 처럼 정수형으로 표현하지 않는 이유는 비트수에 상관없이 통일적으로 색을 표현하기 위함입니다. 백분을 이용해서 0 ~ 1 사이의 값을 가지는 것입니다.
float4 ps_main() : COLOR0
{
return( float4( 1.0f, 0.0f, 0.0f, 1.0f ) );
}
'DirectX' 카테고리의 다른 글
셰이더공부 - 정반사광 (0) | 2018.02.25 |
---|---|
셰이더 공부 - 난반사광 (0) | 2018.02.24 |
셰이더공부 - 텍스쳐 매핑 (0) | 2018.02.23 |
DirectX11 - 정점버퍼, 셰이더 생성 (0) | 2018.01.24 |
DirectX 프레임워크 만들기 - FBX에서 노말, UV, 정점 얻어오기 (0) | 2018.01.18 |