OpenGL-don';如果alpha 我想用C++和GLSL在OpenGL中做什么: 当纹理具有alpha(texture.a!=1.0;)时,该像素不会写入深度缓冲区。(对于颜色缓冲区,它被写入) 写入深度仅在像素纹理时发生。a==1.0

OpenGL-don';如果alpha 我想用C++和GLSL在OpenGL中做什么: 当纹理具有alpha(texture.a!=1.0;)时,该像素不会写入深度缓冲区。(对于颜色缓冲区,它被写入) 写入深度仅在像素纹理时发生。a==1.0,c++,opengl,mask,alpha,depth,C++,Opengl,Mask,Alpha,Depth,在着色器中丢弃不是解决方案-那么该像素不会写入颜色缓冲区 有什么想法吗 @更新: 示例:我有一些由OpenGL渲染的UI图像。其中一些在角落里有阿尔法。 在场景渲染中,我使用“深度预处理”来通过不计算像素上的光线来节省一些像素。 我还想将UI图像添加到该预处理程序中,但仅限于完全不透明的像素(alpha=1.0)。如评论中所述:“在编写片段时,您始终必须写入深度值,无法在着色器级别选择性地启用或禁用该值。”您能否进一步解释您的动机?听起来有点像你在尝试实现与秩序无关的透明度。如果你解释一下你想要

在着色器中丢弃不是解决方案-那么该像素不会写入颜色缓冲区

有什么想法吗

@更新: 示例:我有一些由OpenGL渲染的UI图像。其中一些在角落里有阿尔法。 在场景渲染中,我使用“深度预处理”来通过不计算像素上的光线来节省一些像素。
我还想将UI图像添加到该预处理程序中,但仅限于完全不透明的像素(alpha=1.0)。

如评论中所述:“在编写片段时,您始终必须写入深度值,无法在着色器级别选择性地启用或禁用该值。”

您能否进一步解释您的动机?听起来有点像你在尝试实现与秩序无关的透明度。如果你解释一下你想要实现的技术,我们可以给你一个更好的解决方案。这实际上没有多大意义,你试图在深度预处理中这样做,根据定义应该禁用颜色缓冲区写入,是否丢弃片段不应影响其颜色是否在深度预处理过程中写入颜色缓冲区。我认为您真正想要做的是在GUI渲染期间使用模具缓冲区来屏蔽屏幕的不透明部分,然后增加深度预处理以写入这些位置的深度缓冲区(写入满足模具条件的任何内容的近平面深度)。或者,在进行GUI渲染时写入与深度预处理相同的深度缓冲区;为不透明碎片写入
gl\u FragDepth=0.0
,为任何具有alpha值的碎片写入
gl\u FragDepth=1.0
1.0. 这两种方法都可以,但是如果你这样做的话,你必须在每一帧都重新绘制GUI。这是一种解决方案。但是有一种方法可以不写入alpha像素的深度?基本上,没有。在写入片段时,始终必须写入深度值,无法在着色器级别选择性地启用或禁用该值。您可以编写一个深度值,该值保证在正确的情况下导致深度测试失败(这是我在第二个解决方案中解释的),在这种情况下,您知道深度值不会进入最终的帧缓冲区。或者,如果它确实进入帧缓冲区,则可以确保您写入的深度值等于您清除缓冲区的深度,因此不会产生任何差异。