정점 셰이더, 픽셀셰이더, HLSL 사용법

반응형
정점 셰이더 
: 폴리곤의 형태를 바꾼다.
정점 셰이더에 관한 변수인 LPDIRECT3DVERTEXSHADER9
모델의 정점 데이터 선언에 관한 변수인 LPDIRECT3DVERTEXDECLARATION9이 필요하다.

사용 예
// 정점선언 오브젝트 생성
    D3DVERTEXELEMENT9 decl[] = {
        { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,
                 D3DDECLUSAGE_POSITION, 0 },
        D3DDECL_END()
    };

// 정점 선언
if( FAILED( hr = m_pd3dDevice->CreateVertexDeclaration( decl, &m_pVertexDeclaration ) ) ) {
        return hr;
    }

    // 셰이더 읽기
    if( FAILED( hr = D3DXAssembleShaderFromFile(
                        _T("VertexShader.vsh"), NULL, NULL, 0, &pCode, NULL ))) {
        return hr;
    }

    // 정점 셰이더 생성
    hr = m_pd3dDevice->CreateVertexShader(
                          (DWORD*)pCode->GetBufferPointer(),
                          &m_pVertexShader );
// 렌더링시 셰이더 설정
m_pd3dDevice->SetVertexShader( m_pVertexShader );



픽셀 셰이더 
: 주어진 픽셀에 대한 색을 계산.

픽셀 셰이더에 관한 변수인 LPDIRECT3DPIXELSHADER9가 필요하다.

정점 셰이더와 달리 입력되는 데이터가 정해져 있으므로 

정점 셰이더 처럼 포멧에 대한 정보가 필요없다.


사용 예

// 픽셀 셰이더 생성

if (FAILED( hr = m_pd3dDevice->CreatePixelShader(

(DWORD*)pCode->GetBufferPointer(),

&m_pPixelShader ) ) )


// 렌더링시 셰이더 설정

m_pd3dDevice->SetPixelShader( m_pPixelShader );




HLSL의 사용

:이펙트 파일이라고 불리는 텍스트 파일을 사용.

이펙트에 관한 변수인 LPD3DXEFFECT이 필요하다

이펙트 파일을 사용하는 두가지 방법

1. 실행시에 D3DXCreateEffectFromFile()을 사용해서 직접 읽음

  사용 예

   // 셰이더 읽기

   FILE *fp;

   if( NULL==(fp = fopen("hlsl.obj", "rb")) ) return -1;

   fseek( fp, 0L, SEEK_END );

   long size = ftell( fp );

   fseek( fp, 0L, SEEK_SET );

   char *pSrc = new char[size];

   fread( pSrc, size, sizeof( char ), fp );

   fclose(fp);

   LPD3DXBUFFER pErr=NULL;

   if( FAILED( hr = D3DXCreateEffect(

                    m_pd3dDevice, pSrc, size, NULL, NULL,

                    0, NULL, &m_pEffect, &pErr) ) )

   {

       // 셰이더 읽기 실패..

   }else{

       m_hTechnique = m_pEffect->GetTechniqueByName( "TShader" );

       m_hmWVP = m_pEffect->GetParameterByName( NULL, "mWVP" );

   }

   

   ...

   // 렌더링시 셰이더 설정

   m_pEffect->SetTechnique( m_hTechnique );

   m_pEffect->Begin( NULL, 0 );

   m_pEffect->Pass( 0 );

   

   // 셰이더 상수 설정

   m = m_mWorld * m_mView * m_mProj;

   m_pEffect->SetMatrix( m_hmWVP, &m );


   m_pEffect->SetTexture("Tex", m_pMesh->m_pTextures[0]);

   

   // 렌더

   m_pd3dDevice->SetVertexDeclaration( m_pDecl );

   m_pMesh->Render( m_pd3dDevice ); // 렌더

   m_pEffect->End();


2. 미리 fxc.exe를 사용하여 이펙트 파일을 이진파일로 만들어 두고

  애플리케이션에서 D3DXCreateEffect()을 사용해서 읽어들임

   사용방법은 위와 거의 동일한데 D3DXCreateEffect 대신에 

   D3DXCreateEffectFromFile을 사용한다.


Reference Link

- D3DVERTEXELEMENT9 msdn

- DirectX9 셰이더 프로그래밍 

4_sample.zip


-


TAGS.

Comments