※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다. ※
※ 생략 되어 있는 부분이 많습니다. ※
struct VtxD
{
D3DXVECTOR3 p;
DWORD d;
VtxD() : p(0, 0, 0), d(0xFFFFFFFF) {}
VtxD(FLOAT X, FLOAT Y, FLOAT Z, DWORD D = 0XFFFFFFFF) : p(X, Y, Z), d(D) {}
enum { FVF = (D3DFVF_XYZ | D3DFVF_DIFFUSE), };
};
LPDIRECT3DVERTEXSHADER9 m_pVs;
LPDIRECT3DVERTEXDECLARATION9 m_pFVF;
LPD3DXCONSTANTTABLE m_pTbl;
VtxD m_pVtx[3];
이번엔 색상값이 들어가므로 DWORD d와, FVF에서 Diffuse가 추가 되었다.
*shader.fx*
// For Vertex Processing Input
struct SvtxIn
{
float3 Pos : POSITION;
float3 Nor : NORMAL;
float4 Dif : COLOR;
float2 Tex : TEXCOORD;
};
// For Vertex Processing Output
struct SvtxOut
{
float4 Pos : POSITION;
float4 Dif : COLOR;
float2 Tex : TEXCOORD0;
float4 Nor : TEXCOORD7; // 법선 벡터는 출력 레지스터가 없으므로 TEXCOORD 이용
};
SvtxOut VtxPrc(SvtxIn In)
{
SvtxOut Out = (SvtxOut)0; // Initialized to 0
Out.Pos = float4(In.Pos, 1);
Out.Dif = In.Dif;
return Out;
}
이번 셰이더 파일은 구조체를 이용하여 정점의 입력,출력을 처리하고 있다.
VtxPrc 정점 셰이더 함수 안에서 입력받는 포지션과, diffuse 색상값을 출력 데이터로 설정해서 리턴해주고 있다.
m_pVtx[0] = VtxD(-1, -1, 0, D3DXCOLOR(1, 0, 0, 1)); //빨강
m_pVtx[1] = VtxD(0, 1, 0, D3DXCOLOR(0, 1, 0, 1)); //초록
m_pVtx[2] = VtxD(1, -1, 0, D3DXCOLOR(0, 0, 1, 1)); //파랑
정점 셰이더 시맨틱과 동일하게 데이터의 출처에 대한 식별을 위해 사용한다.
시맨틱 위치는 구조체 멤버 뒤, 함수의 인수 뒤, 함수 뒤 등에 붙여서 사용한다.
COLOR, COLOR[0, 1]: 정점 처리 과정에서 만들어진 Diffuse(0)와 Specular(1)
TEXCOORD, TEXCOORD[0~7]: 텍스처 좌표
COLOR[n] 색상 → oC[n], COLOR =COLOR0
TEXCOORD[n]: → 텍스처 좌표
DEPTH[n]: → oDepth[n], DEPTH = DEPTH0
1.
float4x4 mtWorld : register(c0 ); // 전역 변수 mtWorld를 상수 레지스터 c0에 바인딩
float4 vcLight : register(c10); // 전역 변수 vcLight를 상수 레지스터 c10에 바인딩
2.
// Pixel Shader Main Function
//float4 PxlPrc(float2 vTex : TEXCOORD0) : COLOR0
//{
// return tex2D(DiffuseSampler, vTex);
//}
3.
// Vertex Shader Main Function
void VtxPrc( in float3 iPos : POSITION // dcl_position
, in float4 iDif : COLOR0 // dcl_color0
, out float4 oPos : POSITION // oPos
, out float4 oDif : COLOR0 // oD0
)
{
oPos = float4(iPos, 1);
oDif = iDif;
}
1. 레지스터를 명시해서 바인딩하면 상수 테이블을 이용하지 않고 디바스의 SetVertexShaderConstantF() 함수를 이용해서 c0, c10 레지스터의 값을 변경할수 있으므로 결과적으로 mtWorld, vcLight를 수정한 것과 동일한 결과가 된다고 한다. (짤 사용하는것 같지는 않음..)
2. 사용자가 정의한 픽셀 셰이더 함수, tex2D 함수를 이용한 리턴 값의 타입이 COLOR0 이라고 보면 되는 사용자 정의 함수 사용법.
3. 사용자가 정의한 정점 셰이더 함수, 이번엔 함수가 void 형이다 void 형일 경우엔 인수 앞에 in/out 키워드를 넣어서 입 출력을 지정할수 있는 함수 사용법.
(함수의 인수 값을 내부에서 변경 못하게 하려면 uniform 키워드 사용)
'Shader' 카테고리의 다른 글
7. 알록달록 사각형을 돌려보자.(변환2) (0) | 2017.02.06 |
---|---|
6. 알록달록 사각형을 돌려보자.(변환) (0) | 2017.02.03 |
4. 보라색 삼각형을 그려보자.(Semantic 시맨틱) (0) | 2017.02.03 |
3. 청록색 삼각형을 그려보자(uniform, varing 키워드) (0) | 2017.02.02 |
2. 노란 삼각형을 그려보자..(외부 fx파일, 전역, 지역 변수 핸들 개념 등등..) (0) | 2017.02.02 |