Opengl es 使用OpenGL和GLSL的Alpha混合和人脸排序

Opengl es 使用OpenGL和GLSL的Alpha混合和人脸排序,opengl-es,glsl,opengl-es-2.0,shader,Opengl Es,Glsl,Opengl Es 2.0,Shader,我在写一个小小的3D引擎。我刚刚在我的程序中添加了alpha混合功能,我想知道一件事:我是否需要将所有原语与相机进行比较?) 让我们举一个简单的例子:我有一个场景,由一个天空盒和一棵树组成,树上有阿尔法混合的叶子 下面是这样一个场景的截图: 在这里之前,所有关于叶片相互之间的阿尔法混合似乎都是正确的 但是如果我们再靠近一点 。。。我们可以在图像的右上角看到一个小问题(叶子周围的区域形成了一个四边形) 我认为这个错误源于这样一个事实:这两个四边形(原语)的渲染应该比后面的要晚 你觉得我的假设

我在写一个小小的3D引擎。我刚刚在我的程序中添加了alpha混合功能,我想知道一件事:我是否需要将所有原语与相机进行比较?)

让我们举一个简单的例子:我有一个场景,由一个天空盒和一棵树组成,树上有阿尔法混合的叶子

下面是这样一个场景的截图:

在这里之前,所有关于叶片相互之间的阿尔法混合似乎都是正确的

但是如果我们再靠近一点

。。。我们可以在图像的右上角看到一个小问题(叶子周围的区域形成了一个四边形)

我认为这个错误源于这样一个事实:这两个四边形(原语)的渲染应该比后面的要晚

你觉得我的假设怎么样

PS:我想在一次绘制调用中精确渲染所有与叶子有关的几何体

但如果我是对的,这意味着当我需要渲染像这棵树一样的alpha混合网格时,我需要在每次我的相机移动时更新我的VBO,从相机的角度对所有基本体(三角形或四边形)进行排序。所以后面的原语应该先渲染


你认为我的想法如何?

是的,如果你将深度测试与混合相结合,这就是问题所在。有一些先进的方法试图让GPU为您完成工作,要搜索的关键字是“订单独立透明”(OIT)。但是,在您的情况下,看起来您根本不需要半透明度,您可以通过片段着色器中的alpha测试/某些条件
放弃
。是的,谢谢。我没有使用此说明进行测试。我刚刚在我的片段着色器中替换了它,它可以工作了!因此,如果我理解你所说的,如果我的叶子(在我的例子中)是半透明的,我将不得不对我的原语进行排序(当然是为了获得最佳渲染)!谢谢你的帮助!我去看看OIT!再见。特别是如果你想使用MSAA,启用alpha到coverage是订单无关透明的另一个简单选项。这有点有限,但在这种情况下可能会很好地工作。我对这个问题的回答试图概述一些常见的透明度渲染方法:。