c++ - Direct3D9 渲染 D3DFMT_A8 纹理

标签 c++ direct3d

我有一个使用 D3DFMT_A8 格式的纹理。我想将其渲染为白色(即 RGB 分量均为 255)并使用纹理数据进行 alpha 混合。

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

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

最佳答案

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

因此您必须从 Material /顶点颜色中选择颜色分量,并从 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)

关于c++ - Direct3D9 渲染 D3DFMT_A8 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185702/

相关文章:

c++ - lambda 中的这个 size_t 是做什么的? C++代码

c++ - 相同的代码可以在 Dev C++ 上编译,但不能在 Visual Studio 2017 上编译

c# - 使用 Direct3D 时使用 C++ 而不是 C# 有什么优势吗?

c++ - 具有通用指针类型的自链接类的类设计

c++ - cmake如何避免系统库

c++ - 如何检查 Void 指针是否可以转换为其他特定指针类型?

windows - 您如何从源代码构建 Windows D3D9 refrast?

c++ - 在 Direct3D (DirectX) 应用程序中禁用 alt-enter

c++ - D3D->CreateDevice() 在注入(inject)的 DLL 中失败

c++ - D3D11深度渲染问题