下图中有3个背景:黑色白色&灰色
每个都有3个栏:黑色 - >透明,白色 - >透明和颜色 - >透明
我正在使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);我所有的顶点颜色都是1,1,1,0。
缺陷在白色背景上的白色 - >透明中非常明显。
在Windows XP(和其他Windows风格)上,它完美运行,我完全变白了。然而,在Mac上,我在中间变灰了!
什么会导致这种情况,为什么当我在白色混合白色时会变暗?
完整尺寸的屏幕截图是@ http://dl.dropbox.com/u/9410632/mac-colorbad.png
更新信息:
在Windows上,它似乎与opengl版本无关。所有工作都是2.0到3.2。 在我现在面前的Mac上,它是2.1。
渐变保持在纹理中,并且所有顶点都是彩色的1,1,1,1(白色rgb,完整的alpha)。背景只是1x1像素纹理(用渐变着色),顶点根据需要着色,带有完整的alpha。
地图集是使用glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, data);
创建的。它来自我自己编写的ARGB dds文件。
我还应该注意,所有内容都是使用简单的着色器绘制的:
uniform sampler2D tex1; uniform float alpha; void main() { gl_FragColor = gl_Color * texture2D(tex1, gl_TexCoord[0].st) * vec4(1.0, 1.0, 1.0, alpha); }
alpha均匀设置为1.0
现在,我确实尝试改变它,因此白色渐变不是纹理,而只是4个顶点,其中左边是纯白色和不透明,右边是1,1,1,0,这是有效的!
我现在已经对纹理进行了三次检查,它只是白色,具有不同的alpha 1.0-> 0.0。
我认为这可能是默认问题。 opengl或驱动程序的版本可能会以不同的方式初始化。
例如,我最近发现默认情况下每个人都有GL_TEXTURE_2D glEnabled,而不是英特尔GME965。
解决方案
首先,多一点背景。这个程序实际上是用.NET编写的(在OS X上使用Mono),而我正在编写的DDS文件是通过将24位PNG文件的目录压缩成最小的纹理而自动生成的图集。我正在使用System.Drawing.Bitmap加载这些PNG,并在确定布局后将它们渲染为更大的Bitmap。然后锁定后布局位图(以获取它的字节),然后通过我编写的代码将其写入DDS。
在阅读Bahbar的建议后,我检查了记忆中的纹理,它们确实不同!我的DDS加载似乎是罪魁祸首,而不是任何OpenGL设置。在今天的预感中,我在两个平台上检查了DDS文件本身(使用字节进行字节比较),实际上,它们是不同的!当我使用WTV(http://developer.nvidia.com/object/windows_texture_viewer.html)加载DDS文件时,它们看起来完全相同。但是,使用WTV,您可以关闭每个频道(R G B A)。当我切换掉Alpha通道时,在Windows上我看到了一个非常糟糕的图像。没有alpha会导致没有抗锯齿边缘,所以当然看起来很可怕。当我关闭OSX DDS上的alpha通道时,它看起来很好!
Mono中的PNG加载程序正在进行预乘,导致我遇到的所有问题。我为他们输入了一张票(https://bugzilla.novell.com/show_bug.cgi?id=679242),并直接使用了libpng。
谢谢大家!
答案 0 :(得分:2)
这在黑暗中有点刺,但检查(或明确设置)像素传输模式。
您获得的输出看起来就像您预期的结果,如果您使用具有预乘Alpha的纹理,然后使用您设置的混合模式。有些东西可能会设置像素传输模式,以便在上传纹理时将alpha乘以颜色通道。
当您将混合模式设置为glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
时,您还可以检查Mac结果是否正确(带纹理)。
答案 1 :(得分:1)
检查你的dds加载器。它可能正在进行John Bartholomew在加载时谈论的预乘,只在一个平台上进行。
一种简单的验证方法也是在glTexImage调用中将数据加载到纹理中时查看数据。这些数据是否完全统一?