まず、Stack Overflow を管理しているすべてのユーザーに感謝したいと思います。これは、すべてのソフトウェア開発者にとって素晴らしいリソースです。
最近、あるプロジェクトで DirectShow + DirectX 9 を使用しており、D3DXCreateText() メソッドを使用して 3D でテキストを表示しようとしています。このメソッドは、必要に応じてワールド変換を使用して簡単に変換できるメッシュを提供し、DrawSubset() メソッドで表示します。
HDC hdc = CreateCompatibleDC(NULL);
HFONT font = CreateFont(0,0,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Calibri");
SelectObject(hdc, font);
ID3DXMesh *mesh;
D3DXCreateText(d3dDevice,hdc,"Hello World",0.001f,0.0f,&mesh,NULL,NULL);
--------------------- Now inside beginScene()
...
D3DXMATRIX translation;
D3DXMATRIX scaling;
D3DXMatrixTranslation(&translation,0,0,1);
D3DXMatrixScaling(&scaling,-0.1f,0.1f,0.1f);
d3dDevice->SetTransform(D3DTS_WORLD, &(translation * scaling));
mesh->DrawSubset(0);
...
すべて問題ないようですが、問題があります。このメッシュを単純な色で塗りつぶす方法がわかりません。私は多くの例を読み、DirectX 9 SDK に付属の 3D Text の例も使用しました (D3DMATERIAL9 を使用して埋めています) が、うまくいきません。
より具体的に言えば、このテキストを画面に入力するだけでは、明るい白に見えます (色を変更することはできませんが、少なくとも白です)。また、テクスチャ (DirectShow を使用してカメラからキャプチャしたフレームを表示するために使用しています) を使用してクワッドをレンダリングすると、テキストもこのテクスチャを使用しているように表示されます!:
...
d3dDevice->SetStreamSource(0, vertexBuffer, 0, sizeof(SCREENVERTEX));
d3dDevice->SetTexture(0, texture);
// World transformations for this VertexBuffer in here
d3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
...
これを手伝ってくれませんか?
PS: D3DXVec3Project() で dxDrawText() メソッドを使用して同様の結果を得る方法があることは知っていますが、奥行きのある実際の 3D テキストが必要です。
--------------------------------------------------興味のある人のための解決策 -------------------------------------------------- ----
一方で、@NicoSchertler がアドバイスしたように、DrawPrimitive() 関数でペイントした後、テクスチャを null に設定する必要があります。
d3dDevice->SetTexture(0, NULL);
これはテキストのみを表示しますが、SDK の例で示した SetMaterial() メソッドを使用してもメッシュをペイントすることはできません。だから、@Gnietschowはそれを埋める方法で答えました:
d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CONSTANT);
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT);
d3dDevice->SetTextureStageState(0, D3DTSS_CONSTANT, /* D3DCOLOR HERE */);
そして、これはうまくいきます!ただし、別のテクスチャを再度ペイントする前に、SetTextureStageState() メソッドで定義された各プロパティをリセットする必要があることに注意してください (これを行わないと、テキストに対して以前に定義された色が維持されます)。これはこれで行われます ( doc ):
d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
これが誰かに役立つことを願っています。また、あなたの助けに感謝します:)。