我已经找到了5349574673页关于Alpha混合的页面,但我仍然无法得到想要的结果。我正在尝试使用OpenGL使gif/png文件正确显示(具有透明度/半透明度)。
以下是我的初始化代码:
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); //I've seen this on most tutorials
glDisable(GL_DEPTH_TEST); //it's a 2D game
//...loading matrices and so on
我确信图像是透明的,并且加载正确。
GlBlendFunc(GL_One,GL_One);工作,但我不知道它是否在Alpha通道上做了什么,因为它会渲染为Black=>混合工作
GlColor4f(1f,1f,1f,0.3f);效果很好,我可以画透明的东西
附注:我正在使用这个示例http://lwjgl.org/wiki/index.php?title=Space_Invaders_Example_Game来学习
编辑我使用了用GIMP和其他纹理加载器编码的其他纹理,现在它工作得很好。
2条答案
按热度按时间3bygqnnd1#
您的混合设置是正确的。然而,为了使混合起作用,纹理必须包含Alpha通道,当然,该通道的值是正确的。然后,必须通过图像加载过程来保存Alpha通道数据。我们可以看一下图像加载和纹理生成代码吗?
blpfk2vs2#
Alpha混合公式的主要问题是源/目标/结果颜色的存储方式。我们有两种情况:Alpha预乘(r、g、b通道与Alpha通道相乘);非Alpha预乘(r、g、b不相乘)。您必须确保使用哪种格式来使用正确的混合配方。Alpha预乘是在将一些东西渲染到屏幕时经常使用的,它允许使用更简单和更快的混合公式。
我收集了下面所有的基本案例,但首先是一些信息:
mix(x, y, a) = x * (1 - a) + y * a
。根据我的经验,在GPU碎片着色器中使用mix
版本比使用标准公式要快一点。src.a *= opacity
公式如下:
1.源、目的、结果未预乘
或使用MIX函数:
OpenGL Blend功能:
2.源、目的、结果都是预乘
混合版本:
OpenGL Blend功能:
3.目的地、结果预乘、源未预乘
混合版本:
OpenGL Blend功能:
4.Destination不透明(Dest.a=1.0),因此结果不透明,源不预乘
混合版本:
OpenGL Blend功能: