我在Linux中看到来自OpenGL的颜色/ alpha输出稍微变暗。 而不是看到1.0的红色分量值,我看到〜.96988。 例如,我有一个完全红色的矩形(红色组件= 1.0,alpha = 1.0,绿色和蓝色是零)。 无论是否启用我的顶点/片段着色器,都会发生调光。
照明被禁用,因此在颜色计算中不应包含环境光或其他光。
glBegin(GL_polyGON); glColor4f(1.0,0.0,1.0); glVertex2f(0.0,0.0); glVertex2f(1.0,1.0); glEnd();
我画出了所得到的窗口的截图,然后将图像加载到绘图程序中,检查任何特定的像素。 我看到一个红色的分量整数值为247而不是255,如我所料。 当我运行这个顶点着色器启用时,我看到gl_Color.r组件已经<1.0,并且gl_Color.a组件也是。
所有的OpenGL状态都是默认值。 我错过了什么?
使用分层窗口创build平滑的窗口边界
在Windows / D3D中检测.png alpha通道
由于问题编辑:通过在顶点着色器中检查红色分量的粗糙和迭代过程,并确定红色分量的值为〜.96988,并在红色分量高于阈值时更改蓝色分量以发出信号。 我不断降低恒定的价值,直到我不再看到紫色。 这个诀窍:
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是一个完全饱和的红色矩形,红色= 1.0,Alpha = 1.0。 没有纹理,使用顶点颜色,我得到相同的结果; 稍微暗淡的红色和Alpha组件。
还有一件事,Red和Aplha频道被“调光”了相同的数量。 所以有些东西会导致整个颜色分量变暗。 正如我在主要问题中所述,无论是使用着色器还是固定functionpipe道,都会发生这种情况。
为了好玩,我在Windows中使用DirectX进行了一个类似的testing,结果是红色部分为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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。