glEnable(GL_ALPHA_TEST) 给出了无效的枚举(似乎被折旧了——代码虽然有效——但为什么呢?)

glEnable(GL_ALPHA_TEST) gives invalid enum (seems to be depreciated - code works though - but why?)

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

在我的 OpenGL-code (3.3) 中,我使用的是行

glEnable(GL_ALPHA_TEST);

我已经使用我的代码好几个星期了,从来没有检查过错误(通过 glGetError()),因为它运行良好。现在我做了(因为其他东西不起作用),这一行给我一个无效的枚举错误。 Google 显示 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 个三角形(给出一个四边形)在屏幕上绘制粒子(实例化),在 particle-color 的 alpha-chanel 中,我基本上设置了一个圆(所以 1.0f 如果在圈,否则为 0.0f)。 Depth-testing 当然是为了不从前面的粒子的后面和前面绘制粒子,而 glBlendFunc() (据我了解 glEnabled(GL_ALPHA_TEST) )是为了移除不在圆圈中的位。我仍在学习 OpenGL 并试图理解为什么该代码实际上有效(一次)以及为什么我显然不需要 glEnable(GL_ALPHA_TEST)...

Alpha 测试是一种(自很久以来就已弃用)方法,仅在片段与某些 alpha 函数匹配时才绘制片段。如今,只需丢弃片段,就可以在着色器中轻松完成此操作。 Alpha测试本身也很有限,因为它只能决定画不画片段

一般情况下,启用GL_ALPHA_TEST而不设置适当的glAlphaFunc将不会执行任何操作,因为默认比较函数是GL_ALWAYS,这意味着所有片段都会通过测试。

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

Yes, I'm using discard in the fragment shader. Otherwise, I just used to code above, so I guess, only one depth value (standard?).

discardglEnable(GL_ALPHA_TEST); 的替代品。

So, did I put something redundant in there?

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

由于您所在的配置文件中 glEnable(GL_ALPHA_TEST); 不再存在,因此 glEnable(GL_ALPHA_TEST); 对您的代码没有影响,可以将其删除。