728x90

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

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

struct VtxD
 {
  D3DXVECTOR3 p;
  DWORD d;
  FLOAT u, v;

  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) };

 };

 

LPDIRECT3DPIXELSHADER9  m_pPs;    // Pixel Shader
LPD3DXCONSTANTTABLE  m_pTbl;    // Constant Table

INT   m_nType;   // Pixel Processing Type

VtxD  m_pVtx[4];   // Vertex Buffer

 

포지션과, 색상 값으로 구성된 정점 데이터이다.

 

*shader.fx*


// Pixel Processing Type
int g_nPxlPrc = 2;


// 1.Color Inversion
float4 PxlInverse(float4 Input)
{
     return 1 - Input;
}

// 2.Color Monotone
float4 PxlMonotone(float4 InColor)
{
     float4 Out = 0.f;
     float4 d = float4(0.299, 0.587, 0.114, 0);
     float4 t = InColor;
 
     Out = dot(d, t);
     Out.w = 1;
     return Out;
}

// Main Pixel Processing
float4 PxlPrc( in float4 iDif : COLOR0  // From Vertex Processing
) : COLOR0
{
     float4 Out=float4(0,0,0,1);

     if(1== g_nPxlPrc)
      Out = PxlInverse(iDif);
 
     else if(2 == g_nPxlPrc)
      Out = PxlMonotone(iDif);
 
     else
      Out = iDif;

 

     return Out;
}

 

if문을 통해서 g_nPxlPrc의 값이 0이면 기존색상, 1이면 색상 반전, 2이면 단색화 과정을 처리하고 있다.

 

*Render()*

 

HRESULT hr = 0;

 

m_pdev->SetRenderState(D3DRS_LIGHTING, FALSE);

 

m_pdev->SetPixelShader(m_pPs);

 

m_nType = 2;

 

// 픽셀 shader 전역 변수 값 설정
hr = m_pTbl->SetInt(m_pdev, "g_nPxlPrc", m_nType);

 

m_pdev->SetFVF(VtxD::FVF);
m_pdev->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, m_pVtx, sizeof(VtxD));

 

m_pdev->SetPixelShader(NULL);

 

m_nType의 int형 값을 셰이더의 전역 변수 g_nPxlPrc에 설정해주면서 설정 값에 따른 픽셀 처리 과정을 하게끔 하고 있다.

728x90
Posted by 정망스
,


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