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和最大范围时,我没有得到它们。所以有两件事,首先,如果有人能帮我启动:如果有人明白为什么当我移动矩阵时,它总是出现?