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

 

LPDIRECT3DDEVICE9  m_pDev;    // Device

LPDIRECT3DPIXELSHADER9  m_pPs;    // Pixel Shader
VtxD  m_pVtx[4];   // Vertex Buffer

 

이번엔 픽셀 셰이더를 사용하기 때문에, LPDIRECT3DPIXELSHADER9 가 새로 추가 되었다.

 

*shader.fx*

 

1. 

// float4 PxlPrc(float4 iDif : COLOR0  // From Vertex Processing
//     ) : COLOR0
// {
//  return iDif;
// }

 

2.
void PxlPrc( in float4 iDif : COLOR0  // From Vertex Processing
   , out float4 oDif: COLOR0  // Output oC0
)
{
 oDif = iDif;
}

 

프로그램 가능한 픽셀 파이프라인은 픽셀의 샘플링(Sampling)와, 다중 텍스처 처리(Multi-Texturing)이다.

 

픽셀 파이프라인에 입력되는 데이터는 정점 처리 과정의 Rastering을 통해서 만들어진 픽셀, 텍스처 좌표, 텍스처 이다.

 

픽셀 처리의 결과는 색상이기 때문에 출력은 float4형이고 시맨틱은 COLOR로 한다.

 

1번은 반환형이 있는 함수를 작성할때, 2번은 void형으로 함수를 작성할때의 방법이다.

 

Create()

 

HRESULT hr = 0;

 

hr = D3DXCompileShaderFromFile(
  "data/Shader.fx"
  , NULL
  , NULL
  , "PxlPrc" // shader 실행 함수
  , "ps_2_0" // shader 버전
  , dwFlags
  , &pShd
  , &pErr
  , NULL
 );

 

hr = m_pdev->CreatePixelShader((DWORD*)pShd->GetBufferPointer(), &m_pPs);

 

정점 처리와 마찬가지로 픽셀 처리도 D3DXCompileShaderFromFile 함수를 사용해서 컴파일을 해야 한다.

 

이 후 컴파일 결과를 가지고 CreatePixelShader 함수를 사용해서 픽셀 셰이더를 생성한다.

 

Render()

 

m_pdev->SetRenderState(D3DRS_LIGHTING, FALSE);

 

m_pdev->SetPixelShader(m_pPs);  // Pixel Shader 사용

 

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

 

m_pdev->SetPixelShader(NULL);  // Pixel Shader 해제

 

그전 정점 처리 과정과 다른건 SetPixelShader() 함수를 사용해서 픽셀 셰이더의 사용과 해제를 알려준다는 것이다.

그리고 SetFVF라는 함수가 새로 나왔는데 그전 정점 처리 과정에서 사용하던 SetVertexDeclaration() 함수와 사용 의미는 거의 같다고 한다. 차이점은 정점 정보 선언을 SetVertexDeclaration을 이용할 경우 훨씬 많은 데이터를 포함할수가 있다는 이유 때문에 사용한다고 한다.

728x90
Posted by 정망스
,


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