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的主要内容,如果未能解决你的问题,请参考以下文章