glColor实际上并没有改变OpenGL的颜色
glColor not actually changing OpenGL's color
我有一个特别烦人的问题。在某些情况下,对glColor的调用似乎会被忽略,从而导致对象以不正确的颜色显示。
显示此问题的Qt项目可以在这里找到。
当你运行程序时,你在屏幕上看到的只是两个盒子状的物体,从一个角度看。左边的对象通过调用glCallList(boxModel1);
来渲染,右边的对象通过调用glCallList(boxModel2);
来渲染。这两个显示列表是由明显带有标题的方法创建的。
对于boxModel1
和boxModel2
,我使用一个名为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的使用越来越少了。也许你可以"解决"。你的显示列表有问题
- 使用 OpenGL 4.5 更改所选顶点的颜色
- 为什么我的 LEGACY OPENGL 颜色反转了?
- 如何在 openGL-2D 中绘制不同颜色的线条?
- 从OpenGL应用程序中提取颜色/深度缓冲区
- OpenGL 不渲染颜色
- 在 OpenGL 中将深度映射到颜色
- Opengl 3+ 绘制不同颜色的线条
- 将 OpenGL 颜色附件存储在 constexpr GLenum 数组中
- 获取 OpenGL 纹理中特定像素的颜色
- OpenGL:正在读取颜色缓冲区
- 旋转三角形并在opengl中改变其颜色
- OpenGL不呈现颜色
- 每帧更改顶点的颜色 (OpenGL)
- OpenGL改变生成的纹理的颜色
- 未绘制每个顶点处的C++OpenGL颜色
- SDL2 OpenGL 4.2上下文,具有0个颜色位和0个深度位
- 如何使用glut和openGL更改颜色
- 读取PPM文件并使用Opengl和c++进行显示.颜色不正确
- 如何在OpenGL中更改颜色
- 如何在FTGL OpenGL中更改RGB格式的颜色