Directx 如何填充使用D3DXCreateText创建的三维网格?

Directx 如何填充使用D3DXCreateText创建的三维网格?,directx,direct3d,Directx,Direct3d,首先,我要感谢所有使用mantain Stack Overflow的用户,这对于每个软件开发人员来说都是一个很棒的资源 最近我在一个项目中使用DirectShow+DirectX 9,并尝试使用D3DXCreateText()方法在3D中显示文本。此方法为我提供了一个网格,我可以根据需要使用世界变换轻松地对其进行变换,并使用DrawSubset()方法进行显示: 一切似乎都很好,但我有一个问题:我不知道如何填补这个网格到一个简单的颜色。我已经阅读了很多示例,甚至使用了DirectX9SDK附带的

首先,我要感谢所有使用mantain Stack Overflow的用户,这对于每个软件开发人员来说都是一个很棒的资源

最近我在一个项目中使用DirectShow+DirectX 9,并尝试使用D3DXCreateText()方法在3D中显示文本。此方法为我提供了一个网格,我可以根据需要使用世界变换轻松地对其进行变换,并使用DrawSubset()方法进行显示:

一切似乎都很好,但我有一个问题:我不知道如何填补这个网格到一个简单的颜色。我已经阅读了很多示例,甚至使用了DirectX9SDK附带的3D文本示例(他们使用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);
...
你能帮我吗

注:我知道有一种方法可以将dxDrawText()方法与D3DXVec3Project()结合使用,以获得类似的结果,但我需要一个具有深度的真实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 */);
这很有效!但是,请记住,在再次绘制另一个纹理之前,必须重置使用SetTextRestagestate()方法定义的每个属性(如果不这样做,则将保持先前为文本定义的颜色)。这是通过()完成的:


希望这对任何人都有帮助,再次感谢大家的帮助:)。

如果您只需要一种颜色,您可以通过纹理阶段进行设置(与中相同的方式):


如果需要对文本进行复杂的着色或纹理处理,则必须转换网格的fvf并用适当的数据填充
D3DXCreateText
()仅创建具有位置和法线的网格,但不包含任何颜色和纹理坐标。

是否可以添加应用材质的代码?如果以前应用过纹理,则必须将其重置(将纹理设置为null)。你有灯光吗?谢谢你的快速回答@NicoSchertler。如果我将纹理设置为null,那么文本将显示为白色,但我仍然无法更改其颜色。嗯。。。不,我已经禁用了照明,因为(我想)我不需要它。我将编辑以添加所需的代码。谢谢@Gnietschow的快速回答。这似乎是可行的,但它也改变了我的纹理的颜色。调用DrawPrimitive()方法(绘制与纹理相关联的顶点缓冲区)后,是否有办法说“好,现在清除所有内容并绘制一个不同的对象”?唯一的方法是还原所做的所有更改。设备有一个特定的状态,只能更改,但不能在一个步骤中保存或加载。Hmmmm。。。不,对不起,我试着问应该有一种方法来画两个不同颜色和纹理的物体,对吗?无论如何,在您最初的回复中,您谈到了转换网格的FVF,您的意思是创建一个新的顶点缓冲区并手动复制顶点吗?是的,您必须在调用之间更改设备的状态。例如,首先用绿色绘制文本,因此将上面的代码设置为绿色。第二步,用红色绘制另一个文本,然后再次使用代码将其渲染为红色。然后渲染纹理对象。因此,必须设置纹理阶段状态以使用纹理而不是恒定颜色。并提醒在调用drawcalls之前设置一个unset纹理。
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 */);
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);
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, /* YOUR COLOR */);