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

visualvisual 2010-03-11 03:31:36
在屏幕上绘制两个物体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之中,好像排序也不能解决问题啊。

我在书上看到公式:

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

我想问问,大家是怎样解决这个问题的。谢谢!
...全文
225 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingzhe2001 2010-03-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 visualvisual 的回复:]
如果通过判断物体所在位置的远近来排序,还是无法解决B在A里面 或 A和B有重叠部分的问题。我想使用DepthBuffer或StencilBuffer的方法应该可以解决,但是我还是想不到具体方案。在哪里可以找到这方面的例子?

谢谢!
[/Quote]

如果B在A里面,一般就是先画B,但是肯定不是很精确的,然而你从哪个角度看到的混合结果都一样,玩家也不会说啥。

要绝对的正确一般是用不着的,特别是两个三角形相互交叉的情况。除非你做的是离线渲染,比如是3dmax这种,那你可以对每个三角形甚至每个像素排序。实时的应用比如游戏做到对物体排序就可以了。


利用depth和stencil解决你可以试一试,可以参考一些绘制玻璃折射的论文,一般是绘制比如玻璃杯的折射,用depth一层一层地剥离。
visualvisual 2010-03-11
  • 打赏
  • 举报
回复
谢谢!
gamemagic 2010-03-11
  • 打赏
  • 举报
回复
先画所有不透明物体,再画所有半透明物体 半透明物体能排序的尽量排序,对于相交的,画之前关闭深度测试,画完再打开
gamemagic 2010-03-11
  • 打赏
  • 举报
回复
这个问题至今都没有很好的解决办法,所以楼主要想办法糊弄过玩家的眼睛
visualvisual 2010-03-11
  • 打赏
  • 举报
回复
如果通过判断物体所在位置的远近来排序,还是无法解决B在A里面 或 A和B有重叠部分的问题。我想使用DepthBuffer或StencilBuffer的方法应该可以解决,但是我还是想不到具体方案。在哪里可以找到这方面的例子?

谢谢!
xingzhe2001 2010-03-11
  • 打赏
  • 举报
回复
你猜对了,alpha混合确实是和顺序有关的,需要排序, 特别是你设置的srcblend = srcalpha, dstblend = invsrcalpha。
比方说,那个工具里面,RGBdst是屏幕上已经有的颜色。如果先画A, 再画B, 那么A首先和背景作混合,混合后再和B做混合
color = ( B.rbj * B.a) + (A.rbj * (1 - B.a)) 


如果先画B再画A

color = (B.rbj * (1-.Aa)) + (A.rbj )*A.a


显然如果 1-A.a != B.a的时候, 这两种颜色是不同的

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧