OpenGL 在 GL_QUADS 之上绘制 GL_LINES

Posted

技术标签:

【中文标题】OpenGL 在 GL_QUADS 之上绘制 GL_LINES【英文标题】:OpenGL draw GL_LINES on top of GL_QUADS 【发布时间】:2012-03-05 08:48:52 【问题描述】:

我正在 OpenGL 中以 3D 形式绘制立方体和线网格:

glBegin(GL_QUADS);
...
glEnd();

glBegin(GL_LINES);
...
glEnd();

现在,与顺序无关(如果我先画线或先画四边形),也与位置无关,总是会在立方体上画线。我认为OpenGL从前到后绘制。

我尝试的是使用:

glEnable(GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE);

这确实有效,但现在立方体的一部分是透明的。 我也尝试了glDepthFunc(GL_NEVER) 禁用glEnable (GL_DEPTH_TEST),但我遇到了同样的问题,立方体看起来是透明的。

有没有人提示解决这个问题?

【问题讨论】:

你想要的结果是什么?我不清楚你到底打算在对方面前做什么。绘制立方体时需要启用 GL_DEPTH_TEST,否则立方体的背面可能会覆盖立方体的可见部分。 我想让立方体总是画在线条的前面。所以线条是一种背景。 【参考方案1】:

如果要在背景中绘制线条,只需先绘制它们(以及背景的其余部分),清除深度缓冲区,然后渲染场景的其余部分。

或者你可以给线条一个深度,这样它们总是在其他所有东西的后面,但是你必须确保你的游戏世界对象没有一个在它后面。

【讨论】:

【参考方案2】:

现在,与顺序无关(如果我先画线或先画四边形)和位置,总是会在立方体上画线。

如果您的线条有适当的深度,那么您忘记启用深度缓冲区。如果您启用了深度缓冲区,那么您必须确保您的库用于初始化 OpenGL 请求的深度缓冲区。

我认为 OpenGL 是从前向后绘制的。

它没有。 OpenGL 按照您指定的顺序绘制多边形。没有任何类型的自动排序。

有没有人提示解决这个问题?

好吧,您可以清除深度缓冲区,但这会很慢且效率低下。从技术上讲,您几乎不应该这样做。

glDepthMask(GL_FALSE) 将禁用写入深度缓冲区。即,在该调用之后绘制的任何对象都不会更新深度缓冲区,但会使用已存储的数据。它经常用于粒子系统。所以调用glDepthMask(GL_FALSE),绘制“线条”,调用glDepthMask(GL_TRUE),然后绘制立方体。

如果您将glDepthMask(GL_FALSE)glDepthFunc(GL_ALWAYS) 结合使用,则将始终绘制对象,完全忽略深度缓冲区(但不会更改深度缓冲区)。

【讨论】:

以上是关于OpenGL 在 GL_QUADS 之上绘制 GL_LINES的主要内容,如果未能解决你的问题,请参考以下文章

GL_QUADS 绘制一个凹五边形而不是矩形

用OpenGL画圆

GL_LINES 没有显示在立方体顶部?

无法将纹理绑定到 GL_QUADS

纹理周围的边框,OpenGL

Qt OpenGL 纹理透明度问题