关于显示列表OpenGL SC 1.0.1的问题

关于显示列表OpenGL SC 1.0.1的问题,opengl,opengl-sc,Opengl,Opengl Sc,我对OpenGL SC 1.0.1中的显示列表有几个问题: 如果我理解得很好,显示列表会保存一系列OpenGL原语命令,以便在运行时重新使用。 现在,假设我在这个显示列表中还包含了一个赋值,它改变了在静态序列之外声明的参数的值。 ->在生成显示列表期间,还是在运行时调用此显示列表时,会更新此参数 我只在初始化OpenGL上下文时生成所有显示列表。 但是,在我的应用程序中,出于几个原因,我在运行时的每个周期都会清除glClear。 ->执行glClear命令后,您认为我的所有显示列表都会被删除吗?

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

  • 如果我理解得很好,显示列表会保存一系列OpenGL原语命令,以便在运行时重新使用。 现在,假设我在这个显示列表中还包含了一个赋值,它改变了在静态序列之外声明的参数的值。 ->在生成显示列表期间,还是在运行时调用此显示列表时,会更新此参数

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


  • 显示列表只在调用glNewList时创建一次。然后,当您调用glCallList时,会逐字重复该列表。我不确定参数的确切含义,但如果您的意思是:

    a)C++变量,则这将没有任何效果。显示列表中的OpenGL调用按原样记录。未记录用于访问该调用的循环变量等。 b) OpenGL状态变量(例如,调用以启用GL_照明)。这将被记录(因为显示列表将捕获对glEnable的呼叫)

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

    说到这里,我强烈建议您远离显示列表,转向更好的方式(例如VBO+VAO+GLSL着色器,或VBO+固定函数管道)。显示列表存在大量问题,包括:

    • 它们是驱动程序维护人员的噩梦。因此,图形卡对它们的支持有点参差不齐
    • 并非所有GL API方法都可以在显示列表中调用。某些方法(例如修改客户端状态的方法-例如顶点数组绑定)在显示列表中根本不起作用。另一些则不起作用,因为驱动程序实现者决定不添加支持(例如,NVidia允许在显示列表中调用某些GL3+方法,AMD只允许OpenGL 1.5中的方法)
    • 更新显示列表的速度非常慢
    更确切地说,它是OpenGL SC 1.0.1,适用于您点a):事实上,在我的序列中,出于某些原因,在某一点上,我有一个IF。。。ELSE条件,取决于参数。OpenGL命令调用根据这样的条件而有所不同:比如说命令a或命令B。所以,我知道在序列中这个参数为TRUE。然而,我认为调用这个序列时它是错误的。你认为会调用命令A还是命令B?关于glClear:你的意思是,即使在每个周期调用命令glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT),显示列表及其索引也会保留下来?关于使用VBO+VAO+GLSL着色器或VBO+固定函数管道而不是显示列表的建议:您认为这对SC 1.0.1可用吗?最后,关于不能在显示列表中调用的方法:如果其中一个方法在显示列表中,您认为目标上的行为是什么?撞车?什么也没显示?