Linux OpenGL颜色/alpha输出稍微变暗

Linux OpenGL颜色/alpha输出稍微变暗,linux,opengl,colors,alpha,Linux,Opengl,Colors,Alpha,我看到Linux中OpenGL的颜色/alpha输出稍微变暗。我看到的不是红色分量值1.0,而是0.96988。例如,我有一个完全红色的矩形(红色分量=1.0,alpha=1.0,绿色和蓝色为零)。无论是否启用顶点/片段着色器,都会发生这种暗显 照明已禁用,因此颜色计算中不应包括环境光或其他灯光 glBegin(GL_POLYGON); glColor4f(1.0, 0.0, 0.0, 1.0); glVertex2f(0.0, 0.0); glVertex2f(1.0, 0.0); glVer

我看到Linux中OpenGL的颜色/alpha输出稍微变暗。我看到的不是红色分量值1.0,而是0.96988。例如,我有一个完全红色的矩形(红色分量=1.0,alpha=1.0,绿色和蓝色为零)。无论是否启用顶点/片段着色器,都会发生这种暗显

照明已禁用,因此颜色计算中不应包括环境光或其他灯光

glBegin(GL_POLYGON);
glColor4f(1.0, 0.0, 0.0, 1.0);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.0, 1.0);
glEnd();
我对生成的窗口进行屏幕截图,然后将图像加载到绘图程序中,并检查任何特定像素。我看到一个红色的组件整数值247,而不是我预期的255。当我在启用顶点着色器的情况下运行时,我看到gl_Color.r组件已经<1.0,gl_Color.a组件也是

所有OpenGL状态均为默认值。我错过了什么

因问题而编辑: 通过在顶点着色器中检查红色分量并在红色分量高于阈值时改变蓝色分量以发出信号的粗略迭代过程,我确定红色分量的值为~.96988。我不断减小恒定的threashold值,直到不再看到紫色为止。这就成功了:

if(gl_Color.r > 0.96988)
{
    gl_Color.b = 1.0;  \\ show purple instead of the slightly dimmed red.
}
编辑:

在本例中,Texture0是一个完全饱和的红色矩形,红色=1.0,Alpha=1.0。没有纹理,使用顶点颜色,我得到相同的结果;稍微变暗的红色和阿尔法成分

还有一件事,Red和Aplha通道“变暗”的程度相同。所以有些东西导致整个颜色组件变暗。正如我在主要问题中所说的,无论我使用着色器还是固定穿孔管道,都会发生这种情况


只是为了好玩,我使用DirectX在Windows中执行了一个类似的测试,结果得到了一个红色分量为254的矩形;仍然有些模糊,但几乎没有。我回答我自己的问题,因为我解决了这个问题,我就是原因。结果表明,在从二进制转换为浮点时,我错误地计算了模型中顶点的颜色通道,包括alpha。一个愚蠢的错误导致了这种轻微的变暗

例如:

currentColor = m_pVertices[i].clr; // color format ARGB
float a = (1.0 / 256) * (m_pVertices[i].clr >> 24);
float r = (1.0 / 256) * ((m_pVertices[i].clr >> 16) % 256);
float g = (1.0 / 256) * ((m_pVertices[i].clr >> 8) % 256);
float b = (1.0 / 256) * (m_pVertices[i].clr % 256);
glColor4f(r, g, b, a);
我应该除以255。啊


看起来唯一的模糊是在我的大脑中,而不是在openGL中。

请告诉我您在哪里看到值~.96988。我想使用浮点值是很正常的。你有运行合成器吗?如果是这样的话,请确保它没有通过插件或类似的东西使用您的窗口输出玩游戏。驱动程序是否有gamma集?@MartinBeckett:gamma校正不会改变1或0;0^g=0,1^g=1。我怀疑,某些颜色管理可能会影响操作,或者可能仍然存在一些纹理限制。@datenwolf-如果处理得当,则不会。但是在Windows驱动程序中实现了谁知道呢!
currentColor = m_pVertices[i].clr; // color format ARGB
float a = (1.0 / 256) * (m_pVertices[i].clr >> 24);
float r = (1.0 / 256) * ((m_pVertices[i].clr >> 16) % 256);
float g = (1.0 / 256) * ((m_pVertices[i].clr >> 8) % 256);
float b = (1.0 / 256) * (m_pVertices[i].clr % 256);
glColor4f(r, g, b, a);