首先,我要感谢所有拥有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文本示例(它们使用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 */);
这有效!但是,请记住,必须重新设置用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);
希望这对任何人都有帮助,并再次感谢你们的帮助:)。
最佳答案
如果只需要一种颜色,则可以通过纹理阶段进行设置(与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)仅创建具有位置和法线的网格,但没有任何颜色和纹理坐标。关于directx - 如何填充用D3DXCreateText创建的3D网格?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16803566/