2012-07-12 118 views
0

我有openGL代码,它呈现一些对象并为其中的一些显示文本标签。通过使用gluProject将适当的顶点投影到屏幕上,然后添加一个小的偏移量,使标签位于顶点旁边来显示标签。这样每个标签与屏幕顶点的距离相同。如何在openGL显示列表中投影/未投影

我最初并没有使用显示列表(除了字形的显示列表),并且它正常工作(如果有点慢)。现在我为整个场景创建一个显示列表,并发现标签放置不正确。

我花了一段时间,但我想我已经基本上找到了问题:gluProject将投影矩阵,模型视图矩阵和视口作为参数。除了调用glGetDoublev(GL_MODELVIEW_MATRIX,...)等,我没有办法提供它们。但是,glGet函数在显示列表中是“不允许的”,这在经验上似乎意味着它们不会导致错误,而是立即执行。因此,编译到显示列表中的矩阵数据是从列表编译时间而不是列表执行时间(这是一个问题,因为我需要预编译列表,而不是立即执行)。至少这是我目前的理论。

  1. 任何人都可以确认或否认这会导致问题?
  2. 如何解决这个问题?我只想做gluProject的工作,但使用列表的当前矩阵。

注意:我知道在近期的openGL版本中已经弃用了各种函数/方法;请不要让我的答案沿着“你不应该这样做”;-)

回答

1

想一想:glGet…将一些数据放在进程内存中,可能在堆栈中。绝对没有办法,显示列表甚至可以重现对数据执行的计算,这甚至不在其范围内。除此之外,GLU(注意U)函数不是OpenGL的一部分,因此不要显示在显示列表中。 GLU函数也不是GPU加速的,所有的计算都发生在CPU上,并且由于API设计数据传输效率相当低。

像这些,你发现,使显示列表不切实际的原因之一,为什么他们已被从后来的OpenGL版本剥离的原因之一。换句话说:不要使用它们。

改为使用顶点缓冲区对象和索引缓冲区。像您这样的标签系统可以使用实例化来实现,并由目标位置列表提供。如果实例化不可用,则需要为标签的顶点属性向量提供冗余位置属性。

无论如何:在你的情况下,正确使用着色器和VBOs将轻松胜过任何基于显示列表的解决方案(因为你无法显示列出所有内容)。


相反奇怪,但工作将是调用glRasterPos,glBitmap(因此glutBitmap文本电话)放置在显示列表,所述偏移在实际投影映射前的投影矩阵施加,即

glMatrixMode(GL_PROJECITON); 
glLoadIdentity(); 
scene_projection(); 

draw_scene(); 

glMatrixMode(GL_PROJECITON); 
glLoadIdentity(); 
glTranslatef(...); /* for the offset */ 
scene_projection(); 

draw_labels(); 

虽然这是我12年前完成的工作。绝对不是今天。

+0

当我在显示列表中调用glRotate时,会执行矩阵乘法。所以显示列表在执行时必须以某种方式访问​​当前的投影/模型视图矩阵(或否?)。那么可以不用glProject做什么(不一定直接调用它,而是应用相同的计算),与这些矩阵相乘?这就是我所说的“使用列表的当前矩阵”。或者我误解了一些东西(这很可能)? – Dabbler 2012-07-12 17:32:19