DirectX Graphics 프로그래밍 가이드 프로그래밍 가능한 파이프라인 정점 셰이더 정점색 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
이 예에서는, 정점 데이터내의 정점색을 개체에 적용한다. 정점 데이터에는, 위치의 데이터와 디퓨즈색의 데이터가 포함되어 있다. 이것들을 다음에 나타낸다.
struct CUSTOMVERTEX_POS_COLOR { float x, y, z; DWORD diffuseColor; }; // Create vertex data with position and texture coordinates. CUSTOMVERTEX_POS_COLOR g_Vertices[]= { // x y z diffuse { -1. 0f, 0.25f, 0.0f, 0xffff0000, }, // lower right - red { 0.0f, 0.25f, 0.0f, 0xff00ff00, }, // lower left - green { 0.0f, 1.25f, 0.0f, 0xff0000ff, }, // upper left - blue { -1. 0f, 1.25f, 0.0f, 0xffffffff, }, // upper right - white };
정점 셰이더의 선언에는, 위치와 색의 데이터도 반영시킬 필요가 있다.
// Create the shader declaration. D3DVERTEXELEMENT9 decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 12, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0 }, D3DDECL_END() };
셰이더가 변환 행렬을 얻어온다 방법의 1 개는, 정수 레지스터로부터의 취득이다. 이것을 실시하려면 , SetVertexShaderConstant 를 호출한다.
D3DXMATRIX mat; D3DXMatrixMultiply( &mat, &m_matView, &m_matProj ); D3DXMatrixTranspose( &mat, &mat ); hr = m_pd3dDevice->SetVertexShaderConstantF( 1, (float*) &mat, 4 ); if(FAILED(hr)) return hr;
이 선언은, 1 스트림의 데이터를 선언한다. 이것에는, 위치와 컬러 데이터가 포함되어 있다. 컬러 데이터는 정점 레지스터 1 에 할당할 수 있다. 셰이더를 다음에 나타낸다.
vs_1_1 ; version instruction m4x4 oPos, v0, c0 ; transform vertices by view/projection matrix mov oD0, v1 ; load color from register 1 to diffuse color
여기에는 3 개의 명령이 포함되어 있다. 처음은 항상 버전의 명령이다. 2 번째의 명령은 정점을 변환 한다. 3 번째의 명령은, 정점 레지스터내의 색을 출력 디퓨즈색레지스터로 이동한다. 결과는, 정점색데이터를 사용한 출력 정점이다.
이 결과의 출력은, 다음과 같이 된다.