首先,我要感谢所有支持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);
...
请你帮助我吗?
P.S。:我知道有一种方法可以使用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 */);
这有效!但是,请记住,在重新绘制另一个纹理之前,必须重置使用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);
希望这对任何人都有帮助,并再次感谢你们的帮助:)。
答案 0 :(得分:1)
如果您只需要一种颜色,可以通过纹理阶段设置它(与this question中相同):
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 */);
如果您需要对文本进行复杂的着色或纹理处理,则必须将网格的fvf转换为适当的数据。 D3DXCreateText
(doc)仅创建一个包含位置和法线的网格,但没有任何颜色和纹理坐标。