DirectX Graphics 프로그래밍 가이드 프로그래밍 가능한 파이프라인 프로그래밍 가능한인 스트림 모델 멀티 텍스처의 셰이더 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
여기에서는, 위치와 복수의 텍스처 좌표를 가지는 단순한 정점 셰이더의 초기화와 사용에 필요한 스텝에 대해 설명한다.
최초의 스텝에서는, 위치와 색을 저장 하는 구조체를 선언한다. 이것을, 다음 샘플 코드에 나타낸다.
struct XYZBuffer { float x, y, z; }; struct Tex0Buffer { float tu, tv; }; struct Tex1Buffer { float tu2, tv2; };
다음의 스텝에서는, 정점 셰이더 선언을 생성 한다. 이것을, 다음 샘플 코드에 나타낸다.
D3DVERTEXELEMENT9 decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 1, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, { 2, 0, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1 }, D3DDECL_END() };
여기서, 정점 선언 개체를 생성 한다.
LPDIRECT3DVERTEXDECLARATION9 m_pVertexDeclaration; g_d3dDevice->CreateVertexDeclaration( decl, &m_pVertexDeclaration );
다음의 스텝에서는,IDirect3DDevice9::CreateVertexShader 메서드를 호출해 정점 셰이더를 생성 한다. 최초로, 셰이더를 어셈블(assemble) 할 필요가 있다.
TCHAR strVertexShaderPath[512]; LPD3DXBUFFER pCode; LPDIRECT3DVERTEXSHADER9 m_pVertexShader; hr = DXUtil_FindMediaFileCb( strVertexShaderPath, sizeof(strVertexShaderPath), _T("ShaderFile.vsh"); hr = D3DXAssembleShaderFromFile( strVertexShaderPath, NULL, NULL, dwFlags, &pCode, NULL ); g_d3dDevice->CreateVertexShader( (DWORD*) pCode->GetBufferPointer(), &m_pVertexShader );
정점 버퍼와 정점 셰이더는, 생성 후는 언제라도 사용할 수 있다. 다음 샘플 코드는, 정점 셰이더의 설정 방법법, 스트림 소스의 설정 방법법, 및 새로운 정점 셰이더를 사용하는 삼각형 리스트의 드로잉(Drawing) 방법을 나타내고 있다.
g_pd3dDevice->SetVertexDeclaration( m_pVertexDeclaration ); g_d3dDevice->SetVertexShader( m_pVertexShader ); g_d3dDevice->SetStreamSource( 0, xyzbuf, 0, sizeof(XYZBuffer) ); g_d3dDevice->SetStreamSource( 1, tex0buf, 0, sizeof(Tex0Buffer) ); g_d3dDevice->SetStreamSource( 2, tex1buf, 0, sizeof(Tex1Buffer) ); g_d3dDevice->SetIndices( pIB, 0 ); g_d3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, max - min + 1, 0, count / 3 );