我有openGL代码,可以渲染一些对象并显示其中一些对象的文本标签。显示标签是通过使用gluProject将适当的顶点投影到屏幕,然后添加一个小偏移以使标签位于顶点旁边来完成的。这样,每个标签与屏幕顶点的距离相同。
我最初没有使用显示列表(除了字形的显示列表),并且它正常工作(如果有点慢)。现在我为整个场景构建一个显示列表,并发现标签放置不正确。
我花了一段时间,但我认为我基本上找到了问题:gluProject将投影矩阵,模型视图矩阵和视口作为参数。除了调用glGetDoublev(GL_MODELVIEW_MATRIX,...)等之外,我认为无法提供它们。但glGet函数在显示列表中是“不允许的”,根据经验,这似乎意味着它们不会导致错误,而是立即执行。因此,编译到显示列表中的矩阵数据来自列表编译时间而不是列表执行时间(这是一个问题,因为我需要预编译列表,而不是立即执行它)。至少这是我目前的理论。
注意:我知道在最新版本的openGL中不推荐使用各种函数/方法;请给我一些答案,就像“你不应该这样做”; - )
答案 0 :(得分:1)
考虑一下:glGet…
将一些数据放在进程内存中,可能放在堆栈中。绝对没有办法,显示列表如何甚至可以重现对数据执行的计算,甚至达不到它。除此之外,GLU(注意U)功能不是OpenGL的一部分,因此不要进入显示列表。 GLU功能也不是GPU加速,所有计算都发生在CPU上,并且由于API设计数据传输效率相当低。
像你所发现的那些敏捷,使显示列表相当不切实际的原因之一,为什么它们被从更高版本的OpenGL剥离。或换句话说:不要使用它们。
而是使用顶点缓冲区对象和索引缓冲区。像你这样的标签系统可以使用实例化来实现,由目标位置列表提供。如果实例化不可用,则需要为标签的顶点属性向量提供冗余位置属性。
无论如何:在您的情况下,正确使用着色器和VBO将轻松胜过任何基于显示列表的解决方案(因为您无法显示所有列表)。
相当奇怪,但是工作是调用glRasterPos,glBitmap(因此使用glutBitmap文本调用)放入显示列表,并在实际投影映射之前在投影矩阵中应用偏移,即
glMatrixMode(GL_PROJECITON);
glLoadIdentity();
scene_projection();
draw_scene();
glMatrixMode(GL_PROJECITON);
glLoadIdentity();
glTranslatef(...); /* for the offset */
scene_projection();
draw_labels();
虽然这是我12年前做过的事情。绝对不是今天。