我看到Linux中OpenGL的颜色/alpha输出稍微变暗。我看到的不是红色分量值1.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.
}
编辑:
//VERTEX SHADER
varying vec2 texture_coordinate;
void main()
{
gl_Position = ftransform();
texture_coordinate = vec2(gl_MultiTexCoord0);
gl_FrontColor = gl_Color;
}
//FRAGMENT SHADER
varying vec2 texture_coordinate;
uniform sampler2D Texture0;
void main(void)
{
gl_FragColor = texture2D(Texture0, texture_coordinate) * gl_Color;
}
此实例中的Texture0是一个完全饱和的RED矩形,红色=1.0,Alpha=1.0。没有纹理,使用顶点颜色,我得到相同的结果;略微减弱的红色和阿尔法成分。
还有一件事,红色和Aplha通道被"调暗"了相同的量。因此,某些东西导致整个颜色成分变暗。正如我在主要问题中所说,无论我使用着色器还是固定点管道,都会发生这种情况。
为了好玩,我在Windows中使用DirectX进行了类似的测试,结果得到了一个红色组件为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。Doh!
似乎唯一变暗的是我的大脑,而不是openGL。