在其他粒子的透明部分渲染粒子

问题描述 投票:0回答:1

问题

我正在渲染 3D 立方体,效果很好。然后,我将粒子渲染为点数组,几何着色器将其转换为四边形(2 个三角形)。我遇到的问题是,粒子纹理中的透明部分没有被其“后面”的粒子的非透明颜色替换:

如图所示,其后面的灰色/橙色纹理立方体“通过”粒子的透明部分正确显示。然而,在粒子纹理重叠的地方,“底部”纹理不会通过“顶部”纹理显示出来,即使是在据说是透明的部分中。

在渲染立方体之前,我调用

gl.Enable(EnableCap.DepthTest); gl.DepthMask(true); gl.Disable(EnableCap.Blend);
在渲染粒子之前,

gl.Enable(EnableCap.Blend); gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
(方法名称与原始 openGL 略有不同,因为我使用的是 

Silk.NET,openGL 的薄包装器) 我尝试过的事情

现在,我发现了

一个可能类似的问题

。我不能完全确认,因为图像已经消失了,但我仍然尝试了那里的建议。然而,做

gl.DepthMask(false); gl.Enable(EnableCap.Blend); gl.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);

在渲染粒子之前,粒子之间的混合效果
大部分
都很好。然而,我首先认为它后面的立方体已经消失了 - 但是当我移动相机时,我看到它的小碎片(我花了好几次尝试才能在屏幕截图上得到它)

好吧,我找到了,如果你知道的话,感觉是半显而易见的。
c# opengl transparency opengl-3
1个回答
0
投票
渲染粒子时,我设置了

gl.DepthMask(false);

,但粒子是我每帧所做的最后一个openGL事情。因此,当下一帧开始时,深度掩模仍然关闭。显然这也会影响

glClear()

,所以深度缓冲区根本没有被清除。

© www.soinside.com 2019 - 2024. All rights reserved.