glEnable(GL_ALPHA_TEST)给出了无效的枚举(似乎是贬值的-代码虽然有效-但为什么?)



快速问题-标题说明一切:

在我的OpenGL代码(3.3(中,我使用的是

glEnable(GL_ALPHA_TEST);

我已经使用我的代码好几个星期了,从来没有检查过错误(通过glGetError(((,因为它工作得很好。既然我这样做了(因为其他东西不起作用(,这一行给了我一个无效的枚举错误。谷歌透露,glEnable(GL_ALPHA_TEST(似乎从OpenGL 3(核心配置文件?(开始贬值,我想这就是错误的原因。

但这部分代码仍然完全符合我的要求。更多代码:

glDisable(GL_CULL_FACE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_ALPHA_TEST);
// buffer-stuff
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 9, NumParticles);

那么,我在里面放了多余的东西吗?我在屏幕上绘制粒子(实例化(,每个粒子使用2个三角形(给出一个四边形(,在粒子颜色的alpha通道中,我基本上是在设置一个圆圈(如果在圆圈中,则为1.0f,否则为0.0f(。当然,深度测试用于不从后面绘制粒子,而glBlendFunc(((以及我所理解的glEnabled(GL_ALPHA_TEST((用于删除不在圆圈中的位。我仍在学习OpenGL,并试图理解为什么该代码确实有效(这一次(,以及为什么我显然不需要glEnable(GL_ALPHA_TEST(。。。

是的,我在片段着色器中使用丢弃。否则,我只是习惯于上面的代码,所以我想,只有一个深度值(标准?(。

discardglEnable(GL_ALPHA_TEST);的替代品。

那么,我在里面放了多余的东西吗?

是的,如果您使用glEnable(GL_ALPHA_TEST);仍然存在的配置文件,并且如果您对glAlphaFunc将丢弃该片段的每个具有alpha的片段使用discard,则discardglEnable(GL_ALPHA_TEST);将是多余的。

由于您所在的配置文件中已不存在glEnable(GL_ALPHA_TEST);,因此glEnable(GL_ALPHA_TEST);在您的代码中没有任何作用,可以删除。

Alpha测试是一种(自多年以来一直不推荐使用(方法,只在片段与某个Alpha函数匹配时绘制片段。如今,只需丢弃碎片,就可以在着色器内部轻松完成此操作。Alpha测试本身也非常有限,因为它只能决定是否绘制片段。

通常,启用GL_ALPHA_TEST而不设置适当的glAlphaFunc将没有任何作用,因为默认的比较函数是GL_ALWAYS,这意味着所有片段都将通过测试。

您的代码似乎不依赖于alpha测试,而是依赖于混合(我认为这是因为您正在设置glBlendFunc(。在代码的某个地方,可能还有一个glEnable(GL_BLEND)

相关内容

最新更新