我有一个用于绘制文本和精灵的C ++代码中的钩子DirectX。我测试了它,它很好地适用于2D应用程序。然而,当我尝试使用3D应用程序(实际上是一些复杂的游戏)时,只有文本可见。从那以后我推断出精灵没有被其他东西透支,因此文本也是如此。我设置了标志
SetVertexShader(0);
SetPixelShader(0);
SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
//SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
SetRenderState(D3DRS_ZENABLE, false);
SetRenderState(D3DRS_LIGHTING, FALSE);
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_DIFFUSE);
SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
出于某种原因,ALPHABLEND
导致精灵在任何应用程序中根本不可见,所以我没有启用它并且它被注释掉了。
是否存在在D3D上绘制精灵的任何防错方法?否则,我应该为它们使用不同的标志/值吗?
另外,我应该为sprite设置哪个z-index,以防它真正“在”某些其他精灵/对象之下?
(我不是设备的任何作者的作者,我只有钩住的DirectX API,甚至不知道我绘制的应用程序代码。)
答案 0 :(得分:0)
首先,将精灵渲染到D3D设备的最简单方法是ID3DXSprite。
其次,我认为有一个拼写错误,你打算将COLOROP设置为MODULATE,而不是ALPHAOP。
但是,我认为在这两种情况下,如果你的alpha为0,你最终只会得到一个不可见的输出。难道你正在使用的纹理是完全透明的吗?
此外,在完成注入的渲染代码后,不要忘记恢复您(直接或间接)更改的所有渲染状态。一种简单的方法是捕获状态块并在完成自己的渲染后应用它。