今日は Dx3Dにはまりました……。
20回とか30回とか連続で、同じ頂点を使用&同じテクスチャを使って描画する必要があったとします。そんな中、16回目を描画した後、1回だけ別の頂点を使用し且つテクスチャ無しで描画する必要が出てきたとしましょう。
このとき、私は次のようにコードを書きました。
<イメージコード>
IDirect3DDevice9* p3D9 = どうにかする。;
IDirect3DBaseTexture9* pTex = NULL;
DWORD dwFVF = 0;
// テクスチャ無しで描画する必要があるから、
// テクスチャとかを保存
p3D9->GetTexture(0, &pTex);
p3D9->GetFVF(&dwFVF);
// ユーザーポインタ指定・テクスチャ無しで描画
p3D9->SetTexture(0, NULL);
p3D9->SetFVF(tVertexType::FVF);
p3D9->DrawPrimitiveUP(
D3DPT_TRIANGLEFAN, 2,
m_sVertexUP, sizeof(tVertexType));
// ↑SetStreamSourceで、頂点切り替えてないから
// VertexBufferを再設定する必要はないよね?
// 保存してあったテクスチャとかを戻す
p3D9->SetTexture(0, pTex);
p3D9->SetFVF(dwFVF);
pTex->Release();
</イメージコード>
こんな感じのコードを書きました。SetStreamSourceで、VertexBufferを切り替えてないから再設定する必要はないよね〜。と思ってたんです。
が、再度SetStreamSourceで使う頂点を再設定しないと全然ダメでした…。何でやねん…… orz
こんなことマニュアルに書いてあるんかーー!と思ったら
IDirect3DDevice9::DrawPrimitiveUP の呼び出しの後、IDirect3DDevice9::GetStreamSource で参照されるストリーム 0 の設定は、NULL に設定される。