シェーダの使い方
シェーダプログラムの書き方はまあ大体わかったとして、一応プログラムの呼び出し側もメモっとく。
この例は前回のシェーダで通常のメッシュを描画する場合。
行列やライトの定義とか、メッシュのマテリアルやテクスチャを取得するメソッドとかは適当に脳内補完すべし。
pEffect->SetTechnique(_T("TechniqueTexture")); UINT nPasses; pEffect->Begin(&nPasses, 0); pEffect->SetMatrix(_T("g_WorldViewProj"), &worldViewProj); pEffect->SetMatrix(_T("g_World"), &worldMatrix); pEffect->SetVector(_T("g_LightDirection"), (D3DXVECTOR4*)&lightDirection); pEffect->SetVector(_T("g_LightDiffuse"), (D3DXVECTOR4*)&lightDiffuse); pEffect->SetVector(_T("g_LightAmbient"), (D3DXVECTOR4*)&lightAmbient); DWORD dwNumMaterials = pMesh->GetNumMaterials(); for(DWORD nMaterial = 0; nMaterial < dwNumMaterials; nMaterial++){ pEffect->SetVector(_T("g_MaterialDiffuse"), (D3DXVECTOR4*)&pMesh->GetMaterial(nMaterial).Diffuse); pEffect->SetTexture(_T("g_MeshTexture"), pMesh->GetTexture(nMaterial)); for(UINT i = 0; i < nPasses; i++){ pEffect->BeginPass(i); pMesh->DrawSubset(nMaterial); pEffect->EndPass(); } } pEffect->End();
昨日言ってた「メッシュのポリゴン色は頂点シェーダの入力セマンティックから渡ってこないのか」という疑問について調べたところ、答えは「渡ってこない」のようだ。
なぜならID3DXMeshインターフェースの頂点情報には頂点カラーは含まれていないから。そのためのマテリアル構造体なんだからそりゃそうか。メッシュには何千何万という頂点が存在することもあるので、全部の頂点バッファに色情報を格納していてはメモリの浪費になるからとか。
そういやそもそも頂点フォーマットをシェーダに渡さなくていいのか?と思ったが、ID3DXMeshを使う限りは頂点宣言は不要らしい。