iphone上的opengl es2。一些对象是由具有 alpha 的多层精灵组成的。
然后我还有 UI 元素,这些元素也是由各种精灵组合在一起的,我在其他所有东西之上淡入/淡出。我通过调整着色器中的 alpha 来进行淡入淡出。
我的纹理是在 Photoshop 中制作的带有 alpha 的 PNG。我不是故意的。我希望它们是直接 alpha,但在我的应用程序中,它们表现得好像它们是预乘的,我可以看到在白色背景上绘制的白色精灵周围的暗边。
如果我将混合模式设置为:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
元素很好地组合在一起,没有奇怪的边缘。但是当元素淡出时,它们会在最后弹出。它们将开始褪色,但不会一直下降到 alpha 零。所以在淡出动画结束时,当我删除它们“弹出”的元素时,它们没有完全淡出。
如果我将混合模式切换为:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
元素很好地上下淡化。但是任何白色元素上的白色元素周围都有一个看起来像 alpha 预乘的黑色边缘。查看在白框顶部绘制的白色圆圈:
但是场景中的其他混合对我来说看起来不错。其他透明物体很好地融合在一起。
另一个重要的注意事项是我的着色器处理元素的不透明度和着色元素。对于绘制的每一件事,我乘以元素颜色和带有不透明度值的最终 alpha:
void main(void)
{
gl_FragColor = texture2D(u_textureSampler,v_fragmentTexCoord0);
gl_FragColor = vec4(gl_FragColor.r*u_baseColor.r,gl_FragColor.g*u_baseColor.g,gl_FragColor.b*u_baseColor.b,gl_FragColor.a*u_baseColor.a * u_opacity);
}
这使我可以在我的精灵表中获取一个白色对象并使其成为我想要的任何颜色。或者使用灰色的 baseColor 使对象变暗。
每次我认为我理解了这些混合模式时,就会出现这样的情况,我开始怀疑自己。
是否有其他混合模式组合可以在我的精灵上具有平滑的边缘并且还支持着色器中的 alpha 淡入/混合?
我假设 GL_SRC_ALPHA 需要在着色器中使用 alpha 进行混合。
还是我的问题是我需要使用 PSD 以外的东西来保存我的精灵表?因为在这一点上这几乎是不可能的。
更新:
我认为答案可能只是不,没有办法做我想做的事。第二种混合模式应该是正确的。但它可能在某处将 RGB 与 alpha 相乘,或者它在源文件中预乘。我什至尝试在上面的着色器中自己预乘 alpha,方法是添加:
gl_FragColor.rgb *= glFragColor.a;
但这只会让淡入淡出看起来很糟糕,因为它们淡出时会变灰。如果我自己预乘 alpha 并使用上面的其他混合模式,事情看起来和我原来的一样。它们在没有弹出的情况下淡出,但您仍然可以看到光晕。