opengl:混合跨平台的结果不一致
Posted
技术标签:
【中文标题】opengl:混合跨平台的结果不一致【英文标题】:opengl: blending has inconsistent results across platforms 【发布时间】:2016-11-18 01:12:59 【问题描述】:我在 opengl 中将圆形纹理渲染到三角形上。这很好用。
我启用 GL_BLEND,设置我想要的颜色,然后我将 glBlendFunc 与 GL_ONE 和 GL_ONE_MINUS_SRC_ALPHA 一起使用。
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
glColor4(0x0,0xCC,0x0,0xFF);
在我的主平台 (Linux) 上,我得到了我想要的结果,其中渲染一个圆圈没有方形背景,并且彼此相邻的渲染圆圈看起来符合预期。
但是,如果我更改平台,在本例中为 windows 10,我怀疑这可能不仅仅是 windows-linux 问题,还依赖于硬件?我得到这些结果
相反,圆形纹理使用似乎是半透明的白色背景进行渲染。因此,在彼此之上渲染圆圈会产生奇怪的结果。
如果我使用 GL_SRC_ALPHA 作为我的第一个 blendfunc 参数,我会删除该问题,但在平台之间再次不一致的问题中,纹理边缘呈灰色。
【问题讨论】:
确保您在相同的条件下进行测试:纹理中的 alpha 是什么(可能是图像加载器问题,而不是 GL 本身)?两个平台上有什么 gfx/驱动程序?您在两个平台上的像素格式是什么? (每个r,g,b,a
的位数)
@Spektre 具体来说,我的图像是this,在没有 255 alpha 的任何像素之外有 0 alpha。它是使用glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNEDBYTE, scan0);
加载的,并且加载正常,glGenerateMipMap
也在加载后使用。我在 linux 上使用radeon open source driver,在 Windows 上使用 Radeon R9 280x 的典型最新驱动程序,绝不是过时的卡。最后,我的像素格式是 32 位/像素 (8888)。
glTexImage2D
将图像从 CPU 内存加载到 GL 内存作为纹理,但是您是如何将图像从文件加载到 CPU 内存的? (即图像加载器,其行为可能因平台而异)
【参考方案1】:
不一致最终导致每个平台的图像加载器的实现似乎有所不同,但有趣的是,我没有通过更改图像加载器来解决它。
我实际上只是更改了图像的保存方式。在gimp中,过程是:导出图片(为png)->禁用“保存背景颜色”->禁用“保存透明像素的颜色值”,现在问题不再出现。
【讨论】:
以上是关于opengl:混合跨平台的结果不一致的主要内容,如果未能解决你的问题,请参考以下文章
OTPUB知识课堂:如何保证混合云备份与灾难恢复的数据一致性