【问题标题】:OpenGl alpha test - How to replace AlphaFunc deprecated?OpenGL alpha 测试 - 如何替换已弃用的 AlphaFunc?
【发布时间】:2014-08-09 17:29:43
【问题描述】:

我正在尝试使用 alpha 绘制球体,但我的 Z 缓冲区有问题。一些像素是透明的,但写入 Zbuffer,所以后面的不透明像素被隐藏了。

这是我的设置:

gl Enable: gl DEPTH_TEST.
gl DepthFunc: gl LEQUAL.
gl Disable: gl CULL_FACE.
gl Enable: gl BLEND. 
gl BlendFunc: gl SRC_ALPHA with: gl ONE_MINUS_SRC_ALPHA.

我知道函数 glAlphaFunc(GREATER, aFloat)enable(ALPHA_TEST) 可以做到这一点,但我读到它是自 3.1 版 OpenGL 以来已弃用的函数。如何在不使用 ALPHAFunc 的情况下进行正确的渲染?有人知道一个技巧,或者通过着色器做到这一点的方法吗?

【问题讨论】:

  • 在现代 GL 中,您应该在片段着色器中执行此操作,例如if(result.a > threshold) discard;.
  • 您的问题与此非常相似:stackoverflow.com/questions/23280692/…。我暂时不建议将其作为副本,因为它的用例略有不同。但是我在那个问题上的回答应该仍然适用于你的情况。

标签: opengl alpha depth-testing


【解决方案1】:

这在片段着色器中很容易实现,使用discard 语句来防止片段被渲染:

uniform float alpha_threshold;

void main() {
    vec4 color = ...;
    
    if(color.a <= alpha_threshold) // Or whichever comparison here
        discard;
    
    gl_FragColor = color;
}

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 2020-02-27
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多