读书人

使用Alpha通道时出现了不正常的效果解

发布时间: 2012-02-23 22:01:35 作者: rapoo

使用Alpha通道时出现了不正常的效果
在屏幕上绘制两个物体A和B,A是半透明的,B是不透明的。观察视点离A较近。开启Alpha混合:
m_pIDirect3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,true);
m_pIDirect3DDevice->SetRenderState(D3DRS_BLENDOP,D3DBLENDOP_ADD);
m_pIDirect3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pIDirect3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
m_pIDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(0,0,0,255), 1.0f, 0);

如果先画A再画B,发现透过A看不见B,A后面只是黑色的背景。
如果先画B再画A,透过A就可以发现B的存在。

难道做Alpha混合时要先把场景中的每一个物体做排序吗?
如果B被包裹在A之中,好像排序也不能解决问题啊。

我在书上看到公式:

按照公式上的解释,不管以怎样的顺序都应该可以得到正确的效果啊。

我想问问,大家是怎样解决这个问题的。谢谢!

[解决办法]
你猜对了,alpha混合确实是和顺序有关的,需要排序, 特别是你设置的srcblend = srcalpha, dstblend = invsrcalpha。
比方说,那个工具里面,RGBdst是屏幕上已经有的颜色。如果先画A, 再画B, 那么A首先和背景作混合,混合后再和B做混合

C/C++ code
color = ( B.rbj * B.a) + (A.rbj * (1 - B.a))
[解决办法]
这个问题至今都没有很好的解决办法,所以楼主要想办法糊弄过玩家的眼睛

读书人网 >网络游戏

热点推荐