DirectX Graphics 프로그래밍 가이드 프로그래밍 가능한 파이프라인 픽셀 셰이더 픽셀 셰이더의 생성   [목차열람] [주소복사] [슬롯비우기]
픽셀 셰이더의 생성
 
Microsoft DirectX 9.0

픽셀 셰이더의 생성


이 예에서는, 픽셀 셰이더를 사용해, gouraud shading에 의해 보간 된 디퓨즈색을 지오메트리 평면에 적용하고 있다. 이 예에서는, 셰이더 파일의 내용과 애플리케이션에 필요한 코드를 나타낸다.

픽셀 셰이더를 생성 하려면

Direct3D 샘플을 빌드 해 Microsoft® Direct3D® 샘플을 실행할 방법을 알 수 있는 경우는, 이 예의 코드를 기존의 애플리케이션에 컷 앤드 페이스트 할 수 있다.

스텝 1

픽셀 셰이더 지원을 확인하려면 , 다음 코드를 사용한다. 이 예에서는, 픽셀 셰이더 버전 1_1 을 지원 하고 있을지 어떨지를 확인하고 있다.

 
D3DCAPS9 caps;
m_pd3dDevice->GetDeviceCaps(&caps);        // init m_pd3dDevice before using
if( caps.PixelShaderVersion < D3DPS_VERSION(1,1) )
	return E_FAIL;

Caps 구조체는 파이프라인의 능력을 돌려준다. 지원 하고 있는 모든 셰이더 버전을 테스트하려면 , D3DPS_VERSION 매크로를 사용한다. Caps 로부터 돌려주어진 버전 번호가 1_1 보다 작은 경우, 이 호출은 실패한다. 반대로 말하면1_1 이상의 버전 번호는 모두 성공한다. 테스트한 셰이더 버전을 파이프라인이 지원 하고 있지 않는 경우, 애플리케이션은 다른 렌더링 방법을 사용할 필요가 있다 ( 좀 더 낮은 셰이더 버전이면 이용할 수 있을지도 모른다).

스텝 2

이 예에서는, 2 개의 삼각형으로부터 완성되는 평면을 사용하고 있다. 각 정점의 데이터 구조는, 위치와 디퓨즈색의 데이터를 포함하고 있다. D3DFVF_CUSTOMVERTEX 매크로는, 이 정점 데이터에 맞도록(듯이) 데이터 구조를 정의한다. 실제의 정점 데이터는, g_Vertices 로 불리는 정점의 글로벌 배열로 선언한다. 4 개의 정점이 원점을 중심으로 배치되어 각 정점에는, 다른 디퓨즈색이 주어진다.


// Declare vertex data structure.  
struct CUSTOMVERTEX
{
    FLOAT x, y, z;
    DWORD diffuseColor;
};

// Declare custom FVF macro.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

// Declare the vertex position and diffuse color data.
CUSTOMVERTEX g_Vertices[]=
{
//      x      y      z   diffuse color
    { -1. 0f, -1. 0f, 0.0f, 0xffff0000 },  // red   - lower left
    { +1. 0f, -1. 0f, 0.0f, 0xff00ff00 },  // green - lower right
    { +1. 0f, +1. 0f, 0.0f, 0xff0000ff },  // blue  - upper right
    { -1. 0f, +1. 0f, 0.0f, 0xffffffff },  // white - upper left
};

스텝 3

이 셰이더는, gouraud shading에 의해 보간 된 디퓨즈색의 데이터를 출력 픽셀에 복사 한다. 셰이더 파일 PixelShader.txt 는 다음과 같다.

 
ps_1_1        // version instruction
mov r0, v0     // Move the diffuse vertex color to the output register.

픽셀 셰이더 파일내의 최초의 명령은, 픽셀 셰이더 버전 1_1 을 선언한다.

2 번째의 명령은, 컬러 레지스터 (v0)의 내용을 출력 레지스터 (r0)에 복사 한다. 스텝 1 으로, 보간 된 디퓨즈색을 포함하도록(듯이) 정점 데이터를 선언했으므로, 컬러 레지스터에는, 정점의 디퓨즈색이 들어가 있다. 출력 레지스터는, 렌더링 타겟으로 사용하는 픽셀색을 결정한다 (이 예에서는, 포그(안개:fog)등의 추가 처리는 행해지지 않기 때문에).

스텝 4

픽셀 셰이더는, 픽셀 셰이더의 명령으로부터 생성 된다. 이 예에서는, 이러한 명령은 다른 파일내에 있다. 명령을 텍스트 캐릭터 라인으로 사용할 수도 있다.

 
LPD3DXBUFFER pCode;                  // buffer with the assembled shader code
LPD3DXBUFFER pErrorMsgs;             // buffer with error messages
TCHAR        strPixelShaderPath[512];// used to locate the shader file
DXUtil_FindMediaFileCb( strPixelShaderPath, sizeof(strPixelShaderPath), 
                        _T("PixelShader.txt") );

이 함수는, 샘플 프레임워크(framework)에 의해 사용되는 헬퍼-함수이다. 샘플의 상당수는, 이 샘플 프레임워크(framework)를 베이스로 구축되고 있다.

 
LPDIRECT3DPIXELSHADER9 m_pPixelShader;
D3DXAssembleShaderFromFile( strPixelShaderPath, NULL, NULL, 0,  
                            &pCode, &pErrorMsgs, NULL );   
m_pd3dDevice->CreatePixelShader( (DWORD*) pCode->GetBufferPointer(), 
                                  &m_pPixelShader );

생성 한 셰이더의 참조에는, 포인터 m_pPixelShader 를 사용한다.

스텝 5

출력 픽셀의 렌더링은, 고정 기능 파이프라인의 calling sequence와 유사하지만 셰이더의 설정에 픽셀 셰이더 핸들을 사용하는 점이 다르다.

 
// Turn lighting off for this example.It will not contribute to the 
//   final pixel color.
// Pixel color will be determined solely by interpolating the vertex colors.
m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

m_pd3dDevice->SetStreamSource( 0, m_pQuadVB, sizeof(CUSTOMVERTEX) );
m_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
m_pd3dDevice->SetPixelShader( m_pPixelShader );
m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, 2 );

정점 데이터의 소스는, SetStreamSource 로 설정한다. 이 예에서는,SetFVF 는 유연한 정점 포맷 (FVF) 매크로를 사용하고 있다. 이것은, 정점 데이터 선언으로, 고정 기능 정점 처리의 실행을 Direct3D 에 지시할 경우에 사용하는 것 것과 같다. 정점 셰이더와 픽셀 셰이더는, 함께 사용하는 일도, 개별적으로 사용할 수도 있다. 픽셀 셰이더 또는 정점 셰이더의 몇개의 대신에 고정 기능 파이프라인을 사용할 수도 있다. SetPixelShader 는 픽셀 셰이더를 설정해,DrawPrimitive 는 평면을 드로잉(Drawing) 한다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP