OpenGL颜色/ alpha输出略微变暗

时间:2012-01-11 21:43:03

标签: linux opengl colors alpha

我看到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矩形Red = 1.0,Alpha = 1.0。没有纹理,使用顶点颜色,我得到相同的结果;一个稍微淡化的红色和阿尔法组件。

还有一件事,Red和Aplha频道被“暗淡”了相同数量。因此,某些因素会导致整个颜色分量变暗。正如我在主要问题中所述,无论是使用着色器还是使用固定功能管道,都会出现这种情况。

为了好玩,我在Windows中使用DirectX执行了类似的测试,这导致了一个红色组件为254的矩形;仍然略显暗淡,但几乎没有。

1 个答案:

答案 0 :(得分:2)

我正在回答我自己的问题,因为我解决了这个问题而且我是原因。事实证明,当从二进制转换为浮点时,我错误地计算了模型中顶点的颜色通道,包括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中。