정점 셰이더, 픽셀셰이더, HLSL 사용법
픽셀 셰이더에 관한 변수인 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
- DirectX9 셰이더 프로그래밍
-
'Study > Directx 9' 카테고리의 다른 글
d3dx9d.dll 못 찾을 경울. (0) | 2014.12.29 |
---|---|
디바이스 소실에 따른 처리 (0) | 2011.03.21 |
DirectX SDK 9.0c 의 Pure Device 에 대한 보고 (0) | 2010.08.24 |
비디오 메모리, 시스템 메모리 체크하는법 (0) | 2010.05.31 |
D3D10 resource usage. (0) | 2009.12.16 |