显示列表在调用 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 的方法)。
- 更新显示列表非常缓慢。