gpt4 book ai didi

c++ - 使用 "multiply"混合模式和 alpha 的 Direct3D 渲染 2D 图像

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:49:26 25 4
gpt4 key购买 nike

我正在尝试使用 Direct3D 复制 Photoshop 滤镜乘法。我一直在阅读和搜索不同的渲染状态,我的效果几乎可以正常工作。问题是它忽略了纹理的 alpha 值。

这是一张解释情况的图片:

http://www.kloonigames.com/petri/stackoverflow_doesnt_allow_.jpg

我找到了一个解决方案,即保存没有透明度和白色背景的图像。但我对这个解决方案并不满意。问题是我真的需要使用 alpha 值。我想逐渐淡出图像。如果混合模式忽略了 alpha 值,我将无法执行此操作。

那么问题是如何使用 alpha 渲染图像?

这是混合模式代码:

dev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR);

编辑添加了 SetTextureStageState

dev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
dev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
dev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
dev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

最佳答案

您可以通过在像素着色器中预乘 alpha 或使用具有预乘 alpha 的纹理一步实现此效果。

例如,如果您有 3 种可能的着色器混合操作,并且您希望每一种都考虑到 alpha。

Blend = ( src.rgb * src.a ) + ( dest.rgb * (1-src.a) )
Add = ( src.rgb * src.a ) + ( dest.rgb )
Multiply = (src.rgb * dest.rgb * src.a) + (dest.rgb * (1-src.a) )

您会注意到,乘法不可能通过单次处理完成,因为对源颜色有两个操作。但是,如果您在着色器中预乘 alpha,则可以从混合操作中提取 alpha 分量,并且可以在同一个着色器中混合所有三个操作。

在您的像素着色器中,您可以手动预乘 alpha。或者使用像 DirectXTex texconv 这样的工具来修改你的纹理。

return float4(color.rgb*color.a, color.a);

操作变成:

Blend = ( src.rgb ) + ( dest.rgb * (1-src.a) )
Add = ( src.rgb ) + ( dest.rgb )
Multiply = ( src.rgb * dest.rgb ) + (dest.rgb * (1-src.a) )

关于c++ - 使用 "multiply"混合模式和 alpha 的 Direct3D 渲染 2D 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1613600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com