首页 文章

什么会导致Windows和OS X之间的OpenGL alpha混合差异?

提问于
浏览
9

下图中有3个背景:黑色白色和灰色

每个都有3个条形:黑色 - >透明,白色 - >透明,颜色 - >透明

我正在使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);我所有的顶点颜色都是1,1,1,0 .

缺陷在白色 - >透明的白色背景上非常明显 .

在Windows XP(以及其他Windows风格)上,它完美运行,我完全变白了 . 然而,在Mac上,我在中间变灰了!

什么会导致这种情况,为什么当我在白色混合白色时会变暗?

Screenshot full size is @ http://dl.dropbox.com/u/9410632/mac-colorbad.png

Screenshot

更新信息:

在Windows上,它似乎与opengl版本无关 . 所有工作都是2.0到3.2 . 在我现在面前的Mac上,它是2.1 .

渐变保持在纹理中,并且所有顶点都是彩色的1,1,1,1(白色rgb,完整的alpha) . 背景只是1x1像素纹理(用渐变着色),顶点根据需要着色,带有完整的alpha .

Map 集是用 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 uniform设置为1.0

现在,我确实尝试改变它,所以白色渐变不是纹理,而只是4个顶点,其中左边是纯白色和不透明,右边是1,1,1,0,这是有效的!

我现在已经对纹理进行了三次检查,它只是白色,具有不同的alpha 1.0-> 0.0 .

我想这可能是默认问题 . opengl或驱动程序的版本可能会以不同方式初始化事物 .

例如,我最近发现默认情况下每个人都有GL_TEXTURE_2D glEnabled,而不是Intel GME965 .

SOLUTION FOUND

首先,多一点背景 . 这个程序实际上是用.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,您可以关闭每个 Channels (R G B A) . 当我切换掉Alpha通道时,在Windows上我看到了一个非常糟糕的图像 . 没有alpha会导致没有抗锯齿边缘,所以当然看起来很可怕 . 当我关闭OSX DDS上的alpha通道时,它看起来很好!

Mono中的PNG加载程序是预乘,导致我的所有问题 . 我为他们输入了一张票(https://bugzilla.novell.com/show_bug.cgi?id=679242),并直接使用了libpng .

感谢大家!

2 回答

  • 1

    检查你的dds加载器 . 它可能正在进行John Bartholomew在加载时谈论的预乘,仅在一个平台上 .

    一种简单的验证方法也是在glTexImage调用中将数据加载到纹理中时查看数据 . 这些数据是否完全统一?

  • 2

    这在黑暗中有点刺,但检查(或明确设置)像素传输模式 .

    如果您使用具有预乘alpha的纹理但是然后使用您设置的混合模式,那么您获得的输出看起来就像您期望的结果 . 有些东西可能设置了像素传输模式,以便在上传纹理时将alpha乘以颜色通道 .

    将混合模式设置为 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) 时,您还可以检查Mac结果是否正确(带纹理) .

相关问题