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

时间:2011-11-29 18:29:30

标签: c++ qt opengl

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

可以找到显示此问题的Qt项目here

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

对于boxModel1boxModel2,我使用一个名为squareModel的显示列表来渲染框的边。我这样做是因为虽然在这种情况下方形模型是微不足道的,但实际程序中的squareModel要复杂得多,法线等也会改变。

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

任何人都可以了解这里发生的事情吗?

3 个答案:

答案 0 :(得分:3)

  

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

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

您根本没有发布足够的代码来明确说出任何;这只是最可能的解释。在您发布可重复的案例之前,没有真正的帮助方法。

答案 1 :(得分:1)

我遇到了类似的问题,我用不同颜色绘制了很多点,然后是蓝色线框立方体。 (我在项目中使用了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被忽略一样。

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

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不再被忽略......

欢呼声,

大卫

答案 2 :(得分:0)

尝试使用glIntercept运行您的程序。这允许您记录每个OpenGL调用。比较2715和2716个矩形之间的输出。如果存在任何差异,它应该引导您朝着正确的方向发展。

修改

由于您的实际OpenGL调用似乎没问题,因此您可能会遇到驱动程序问题。你可以尝试不同的环境(显卡,电脑等),因为图腾指出,他没有遇到你的问题。也许您可以提供有关您的环境的一些信息?

尝试渲染没有显示列表的矩形,看看是否有帮助。在哪里使用glCallList,重新编写OpenGL调用序列。如果这样可以解决问题,您就会知道应用程序或驱动程序中的显示列表管理存在问题。

此外,如果显示列表成为问题,您真的需要使用显示列表吗?现在,他们越来越少地使用VBO了。也许你可以用它“解决”你的显示列表问题。