Android OpenGL ES 2纹理图谱出血边缘
目前正在从事视频游戏项目 当我得到:Android OpenGL ES 2纹理图谱出血边缘,android,textures,opengl-es-2.0,artifact,Android,Textures,Opengl Es 2.0,Artifact,目前正在从事视频游戏项目 当我得到: Matrix.orthoM(projectionMatrix, 0, 0, widthwindows, heightwindows, 0, -1, 3); 一切看起来都很好。但是当变量widthwindows与实际屏幕分辨率不同时,我得到了这种效果 我不能使用其他主题中的精确解决方案,因为我的一些瓷砖是曲线或其他任何形状,即使使用-0.5像素也没有效果,它们周围仍然有透明度(甚至一些瓷砖也没有使用64*64,但以12*64为例,因此-0.5像素没有
Matrix.orthoM(projectionMatrix, 0, 0, widthwindows, heightwindows, 0, -1, 3);
一切看起来都很好。但是当变量widthwindows
与实际屏幕分辨率不同时,我得到了这种效果
我不能使用其他主题中的精确解决方案,因为我的一些瓷砖是曲线或其他任何形状,即使使用
-0.5像素
也没有效果,它们周围仍然有透明度(甚至一些瓷砖也没有使用64*64
,但以12*64
为例,因此-0.5像素
没有效果).您可能希望使用PMA(预乘Alpha)。
当绘制具有透明度的精灵时,多次使用正常混合模式。
正常混合模式将精灵的像素颜色乘以该像素的Alpha,并将其添加到背景像素颜色乘以源像素Alpha的1倍。
但是,在缩放和过滤精灵时,这在大多数情况下都有效,这可能会导致半透明像素看起来比实际颜色暗
为了解决这个问题,您需要使用PMA。
因为在混合中,您要将精灵的颜色与精灵的alpha相乘,所以您可以存储已经乘以其alpha的像素颜色。
现在混合模式将如下所示。。。将PMA像素颜色(不乘以alpha)添加到背景颜色乘以源像素alpha的1
在GLE2中,正常混合模式如下:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
PMA混合模式如下所示:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
希望这能解决您的问题。我会尝试禁用此图集上的mip映射,但这可能会导致其他问题,无论如何,您可以尝试。已经完成,没有更改。在一个朋友在纹理图集上使用gemerk过程后,因为我不知道如何启动该过程。它似乎不再有透明的边界,但当我从左或右移动矩阵时,仍然可以得到它们。例如,当我在位置0和最大范围时,我没有得到它们。所以有两件事,首先,如果有人能帮我启动:如果有人明白为什么当我移动矩阵时,它总是出现?