快速问题-标题说明一切:
在我的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(。。。
是的,我在片段着色器中使用丢弃。否则,我只是习惯于上面的代码,所以我想,只有一个深度值(标准?(。
discard
是glEnable(GL_ALPHA_TEST);
的替代品。
那么,我在里面放了多余的东西吗?
是的,如果您使用glEnable(GL_ALPHA_TEST);
仍然存在的配置文件,并且如果您对glAlphaFunc
将丢弃该片段的每个具有alpha的片段使用discard
,则discard
和glEnable(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)
。