0

我对 OpenGL SC 1.0.1 中的显示列表有几个问题:

  1. 如果我理解得很好,显示列表会保存一系列 OpenGL 基元命令,以便在运行时重用。现在,假设我还在此显示列表中包含了一个赋值,该赋值更改了在静态序列之外声明的参数的值。-> 在生成显示列表期间,或者在运行时调用此显示列表时,是否会更新此参数?

  2. 我只在 OpenGL 上下文初始化时生成所有显示列表。但是,在我的应用程序中,出于几个原因,我在运行时的每个周期都执行 glClear。-> glClear 命令后,你认为我所有的显示列表都被删除了吗?因为,通过这样做,我注意到通过显示列表生成的图形组件永远不会被绘制。

4

1 回答 1

0

显示列表在调用 glNewList 时创建一次。然后,当您调用 glCallList 时,该列表会逐字重复。我不确定你所说的参数到底是什么意思,但如果你的意思是:

a) 一个 C++ 变量,那么这将无效。显示列表中的 OpenGL 调用按原样记录。没有记录用于进行该调用的循环变量等。b) OpenGL 状态变量(例如,调用启用 GL_LIGHTING)。这将被记录下来(因为显示列表将捕获对 glEnable 的调用)。

glClear 对显示列表没有影响。glClear 只是将后台缓冲区清除为黑色(或您通过 glClearColor 设置的颜色)。显然,一旦你清除了所有的像素数据,你需要再次重绘它,所以你需要设置投影矩阵,在显示列表中为你的几何体设置正确的变换矩阵,然后再次调用 glCallList 重复该列表中的操作列表。

说了这么多,我强烈建议您远离显示列表,并转向更好的东西(例如 VBO + VAO + GLSL 着色器,或 VBO + 固定功能管道)。显示列表存在大量问题,包括:

  • 它们是驱动程序维护者的噩梦。因此,对它们的显卡支持有点混杂。
  • 并非所有 GL API 方法都可以在显示列表中调用。某些方法(例如那些修改客户端状态的方法 - 例如顶点数组绑定)根本无法在显示列表中工作。其他的不工作只是因为驱动程序实现者决定不添加支持(例如 NVidia 将允许在显示列表中调用一些 GL3+ 方法,AMD 只允许来自 OpenGL 1.5 的方法)。
  • 更新显示列表非常缓慢。
于 2019-10-01T04:02:33.547 回答