OpenGL在GL_QUADS之上绘制GL_LINES

时间:2012-03-05 08:48:52

标签: opengl

我在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),但我遇到的问题是多维数据集显示为透明。

有没有人提示要克服这个问题?

2 个答案:

答案 0 :(得分:1)

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

或者你可以给线条一个深度,使它们总是落后于其他所有东西,但是你必须确保你的游戏世界对象都不会落后于它。

答案 1 :(得分:1)

  

现在,独立于顺序(如果我先绘制线条或首先绘制四边形)并且与位置无关,则总是会发生线条在立方体上绘制。

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

  

我认为OpenGL是从前到后画的。

没有。 OpenGL以您指定的顺序绘制多边形。没有任何类型的自动分类。

  

有没有人提示要克服这个问题?

好吧,你可以清除深度缓冲区,但这将是缓慢而低效的。从技术上讲,你几乎不应该这样做。

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

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