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:混合跨平台的结果不一致的主要内容,如果未能解决你的问题,请参考以下文章

SDL 3D 平台一致性

OTPUB知识课堂:如何保证混合云备份与灾难恢复的数据一致性

OpenGL ES 2.0:非常不一致的帧率

Flutter 2.x 混合栈路由管理

Intel和Nvidia之间的OpenGL fbo blitting不一致

应用执行相同的查询从数据库获取bytea类型的数据获取结果不一致