这是前一段时间遇到的问题了,最近想起来应该写一写。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