【问题标题】:OpenGL Display ListsOpenGL 显示列表
【发布时间】:2011-12-26 03:53:45
【问题描述】:

有人可以向我解释一下如何在编译后修改 OpenGL 中的显示列表吗?我该如何强制执行,例如对其进行矩阵转换?

提前致谢。

【问题讨论】:

  • 尝试使用顶点缓冲对象。

标签: list opengl matrix


【解决方案1】:

显示列表是不可变的;一旦创建,您就无法更改它们。这就是他们的重点。

如果您想将几何图形构建到可以在矩阵定义的位置呈现的显示列表中,您只需不要将矩阵命令放在显示列表中。只需将绘图内容放在显示列表中即可。当您要渲染该几何图形时,请进行设置工作(包括矩阵内容),然后执行显示列表。

您当前的代码如下所示:

//Every frame
glRotatef(...);
glTranslatef(...);

///More setup work.

glBegin(...);
glVertex/TexCoord/Color/etc(...);
...
glEnd();

您的基于显示列表的代码应如下所示:

//Initialization. Done once.
glBeginList(...);
glBegin(...);
glVertex/TexCoord/Color/etc(...);
...
glEnd();
glEndList();

//Every frame
glRotatef(...);
glTranslatef(...);
...

glCallList(...);

【讨论】:

  • 这正是我不明白的!您如何进行“设置工作”?你到底是什么意思?可以扩展吗? (特别是我不知道你应用矩阵是什么以及如何做)
  • @user10607:你能渲染没有显示列表的东西吗?如果是这样,那就这样做。然后将所有glBegin/End 的内容放在一个显示列表中,并在您将使用glBegin/End 的地方调用该列表。如果您不知道如何在没有显示列表的情况下呈现内容,那么您需要重新表述您的问题。
  • 不,我明白这部分了。但这就像渲染场景一样,如果我必须一直移动一个巨大的网格怎么办?大量的面和顶点,我听说可以将它们全部加载到显示列表中,因此您只需移动列表坐标(不知何故!),这要快得多。比每帧向 OpenGL 提供顶点坐标要快得多。
  • 你这样做:glTransform(..)/glRotate(..); glCallList(..); 这样你的列表将使用指定的变换/旋转呈现。
  • 好的,例如,我提供了一个旋转命令,但是在旋转特定对象后我必须取消它。怎么能做到这一点?还有 Krom,是 glTransform 吗?当我尝试 glTransfrorm(无论如何!)时,我的代码会引发错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 2015-01-30
  • 1970-01-01
相关资源
最近更新 更多