【问题标题】:Direct3D9 Rendering a D3DFMT_A8 textureDirect3D9 渲染 D3DFMT_A8 纹理
【发布时间】:2009-07-26 22:12:51
【问题描述】:

我有一个使用 D3DFMT_A8 格式的纹理。我想把它渲染成白色(即 RGB 分量都是 255)并使用纹理数据进行 alpha 混合。

如果可能的话,我想这样做而不必编写像素着色器(如与现有着色器一起工作而无需更改,以及固定功能管道)。

我可以让 alpha 混合位像任何其他纹理一样工作,但是 RGB 分量都被视为黑色,而我需要将它们视为白色......

【问题讨论】:

    标签: c++ direct3d


    【解决方案1】:

    似乎颜色/alpha 操作将 D3DFMT_A8 纹理的颜色分量解释为 rgb(0,0,0)。

    所以你必须从材质/顶点颜色中选择颜色分量,从 alphamap 中选择 alpha 分量:

    _d3d9Device.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1)  
    _d3d9Device.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CURRENT)
    _d3d9Device.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1)  
    _d3d9Device.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE)
    

    然后你可以调制颜色纹理:

    _d3d9Device.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE  )  
    _d3d9Device.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT)
    _d3d9Device.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE)
    

    当然,必须启用 alpha 混合:

    _d3d9Device.SetRenderState( D3DRS_ALPHATESTENABLE, False)
    _d3d9Device.SetRenderState( D3DRS_ALPHABLENDENABLE, True)
    _d3d9Device.SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
    _d3d9Device.SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多