728x90

※ 제 개인 공부이므로 풀 소스 코드는 작성하지 않습니다.

※ 생략 되어 있는 부분이 많습니다.

 

 

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));  //파랑

 

이번엔 픽셀 셰이더에서의 시맨틱을 알아보자.

 

정점 셰이더 시맨틱과 동일하게 데이터의 출처에 대한 식별을 위해 사용한다.

시맨틱 위치는 구조체 멤버 뒤, 함수의 인수 뒤, 함수 뒤 등에 붙여서 사용한다.

 

1. 픽셀 셰이더 입력 시맨틱s

 

COLOR, COLOR[0, 1]: 정점 처리 과정에서 만들어진 Diffuse(0) Specular(1)

TEXCOORD, TEXCOORD[0~7]: 텍스처 좌표

2. 픽셀 셰이더 출력 시맨틱s

 

COLOR[n] 색상 → oC[n], COLOR =COLOR0

TEXCOORD[n]: → 텍스처 좌표

DEPTH[n]:  oDepth[n], DEPTH = DEPTH0

 

*shader.fx*

 

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 키워드 사용)

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침