WebGL可以使用UNPACK_PREMULTIPLY_ALPHA_WEBGL功能,向GPU传输纹理数据时自动给Red、Green、Blue预乘Alpha
webgl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);
因为Premultiplied Alpha格式可以方便对纹理进行采样,所以UNPACK_PREMULTIPLY_ALPHA_WEBGL功能很实用。然而OpenGL并没有提供类似的API,在翻译WebGL渲染到OpenGL渲染时可能遇到问题,下面提供一些解决方案
- 发布项目时将纹理资源打包成Premultiplied Alpha格式,这是最好的方案,运行时没有任何性能损耗;
- 生成纹理数据时编程实现预乘,循环将Red、Green、Blue乘以Alpha得到预乘后的数据;
- 实现Shader进行预乘,将初始的纹理数据绘制到RenderTarget,此RenderTarget即为预乘后的纹理;