glColor实际上并没有改变OpenGL的颜色

glColor not actually changing OpenGL's color

本文关键字:颜色 OpenGL 改变 实际上 并没有 glColor      更新时间:2023-10-16

我有一个特别烦人的问题。在某些情况下,对glColor的调用似乎会被忽略,从而导致对象以不正确的颜色显示。

显示此问题的Qt项目可以在这里找到。

当你运行程序时,你在屏幕上看到的只是两个盒子状的物体,从一个角度看。左边的对象通过调用glCallList(boxModel1);来渲染,右边的对象通过调用glCallList(boxModel2);来渲染。这两个显示列表是由明显带有标题的方法创建的。

对于boxModel1boxModel2,我使用一个名为squareModel的显示列表来呈现盒子的侧面。我这样做是因为虽然在这种情况下的方形模型是微不足道的,但在我的实际程序中的squareModel要复杂得多,具有改变的法线等。

这个问题与createManyRectangles方法有关。当调用一个足够小的数字(对我来说是2715)时,颜色会正常显示:一个蓝框和一个红框。当数字较大时(对我来说是2716),颜色将被忽略,并且两个框都呈现为白色。

有人能解释一下这里发生了什么吗?

所有渲染都是通过显示列表完成的,但是当我在显示列表中指定颜色时,以及当我在调用显示列表之前指定颜色时,都会出现问题。

显示列表不是自包含的。他们不恢复 OpenGL状态后,他们已经改变了。如果DL改变了OpenGL状态,那么在DL执行之后,OpenGL的状态也会改变。

你只是没有发布足够的代码来明确地说任何;这是最有可能的解释。除非你可以发布一个可复制的案例,否则没有真正的方法可以提供帮助。

我有一个类似的问题,我用不同的颜色绘制了很多点,然后画了一个蓝色的线框立方体。(我在我的项目中使用了GLUT)

最初我的代码是这样的:

glBegin(GL_POINTS);
    for(int i=0;i<N;i++)
     {
      glColor3f(R[i],G[i],B[i]);
      glVertex3f(X[i],Y[i],Z[i]);
     }
glEnd();
glColor3f(0.0f, 0.0f, 1.0f);
glutWireCube(2.0f);

然而,这会导致一个闪烁的立方体不断地从一帧到另一帧改变它的颜色,变成一些不可预测的颜色,就好像最后一个glColor3f被忽略了。

解决方案:我将立方体的glColor3f放在glEnd()之前。

glBegin(GL_POINTS);
    for(int i=0;i<N;i++)
     {
      glColor3f(R[i],G[i],B[i]);
      glVertex3f(X[i],Y[i],Z[i]);
     }
glColor3f(0.0f, 0.0f, 1.0f);    // <= Changed only the position of this line
glEnd();
glutWireCube(2.0f);
我不知道为什么,但这解决了我的问题。现在我得到了一个蓝色的线框立方体,glColor3f不再被忽略了…

欢呼,大卫

尝试使用glIntercept运行程序。这允许你记录每一个OpenGL调用。比较矩形数量为2715和2716之间的输出。如果有任何不同之处,它应该会指引你正确的方向。

编辑

因为你实际的OpenGL调用看起来不错,它可能是驱动程序的问题,正如你提到的。你可以尝试不同的环境(视频卡,pc等),因为正如totem指出的那样,他没有遇到你的问题。也许你能提供一些关于你的环境的信息?

尝试渲染没有显示列表的矩形,看看是否有帮助。在使用glCallList的地方,重做OpenGL调用的序列。如果这解决了问题,你就会知道你的应用程序或驱动程序中的显示列表管理有问题。

另外,如果显示列表是问题所在,您真的需要使用显示列表吗?一段时间以来,vbo的使用越来越少了。也许你可以"解决"。你的显示列表有问题