【问题标题】:opengl: blending has inconsistent results across platformsopengl:混合跨平台的结果不一致
【发布时间】: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 内存的? (即图像加载器,其行为可能因平台而异)

标签: c++ .net opengl graphics transparency


【解决方案1】:

不一致最终导致每个平台的图像加载器的实现似乎有所不同,但有趣的是,我没有通过更改图像加载器来解决它。

我实际上只是更改了图像的保存方式。在gimp中,过程是:导出图片(为png)->禁用“保存背景颜色”->禁用“保存透明像素的颜色值”,现在问题不再出现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2012-04-05
    相关资源
    最近更新 更多