Direct3D绘制透明纹理有黑边,alpha预乘来解决

在Direct3D中遇到透明纹理显示黑边的问题,通过理解Alpha Premultiplied的概念,作者尝试了在渲染时、贴图加载时和内存处理后进行alpha预乘,分别遇到Shader采样、Mipmap精度丢失和性能影响等问题。最终,通过调整纹理转换工具的参数解决了黑边问题,但发现高Mip级别质量下降。建议深入学习商业引擎的处理手法或预处理资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这是前一段时间遇到的问题了,最近想起来应该写一写。alpha预乘,关键词是Alpha Premultiplied,这个事情我之前陆续了解过不少,只是没想到在D3D里面实际遇到了一次。文末有相关的一些资料可以参考。

    如果你有贴图是带alpha通道的,那么他们互相blend的时候很有可能出现这样的情况,详细成因展开就太多了,可以参考末尾的资料等。这个是典型的没做alpha预乘导致的问题,D3D里默认我们使用

device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

如果要修改为alpha预乘,需要使用如下代码

device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
device->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD);

    但是如何去做alpha预乘呢?这里我们只是修改了他们在渲染时的混合方式,各个游戏引擎里可能有贴图切换strai

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值