【发布时间】: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