代码之家  ›  专栏  ›  技术社区  ›  Mikulas Dite

在D3D设备上绘制精灵

  •  0
  • Mikulas Dite  · 技术社区  · 15 年前

    我有一个钩子DirectX使用在C++代码中绘制文本和精灵。我测试过它,它很好地应用于二维应用程序。但是,当我尝试使用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 导致sprite在任何应用程序中都不可见,所以我没有启用它,它被注释掉了。

    是否有任何防故障的方法来绘制精灵超过d3d存在?否则,我应该为它们使用不同的标志/值吗?

    另外,如果sprite真的“在”其他sprite/对象下,我应该为它设置哪个z索引?

    (我并不是这个设备的作者,我只拥有挂接的DirectxAPI,甚至不知道我画的应用程序代码)。

    1 回复  |  直到 15 年前
        1
  •  0
  •   smocoder    15 年前

    首先,将精灵渲染到D3D设备的最简单方法是id3dxsprite。

    第二,我认为有一个打字错误,你的意思是要设置colorop来调节,而不是alphaop。

    但是,我认为在这两种情况下,如果alpha为0,则最终只能得到一个不可见的输出。你使用的纹理是完全透明的吗?

    另外,在完成注入的渲染代码之后,不要忘记恢复您(直接或间接)更改的所有渲染状态。一个简单的方法是捕获一个状态块,并在完成自己的渲染后应用它。