UV Coords包括相邻的Sprite

时间:2015-06-04 03:00:29

标签: java android opengl-es-2.0

我的精灵是穿制服的spritesheet的一部分,每个精灵都在四边形的顶部和右侧绘制了额外的像素。它们似乎来自相邻的精灵。以下是我定义UV Coords的方法:

ratio = spriteCountX / spriteCountY;

UVcoords.x = (float)(index % spriteCountX) / (float)spriteCountX;
size.x = ratio / (float)spriteCountX;

UVcoords.y = (float)(index / spriteCountX) / (float)spriteCountY;
size.y = 1.0f / (float)spriteCountY;

顶点数据:( x,y,z位置加上每个顶点的UV坐标)

vertexData[] = {  -size.x / 2,    size.y / 2,   0,  UVcoords.x,                     UVcoords.y,
                  -size.x / 2,    -size.y / 2,  0,  UVcoords.x,                     UVcoords.y + size.y,
                  size.x / 2,     -size.y / 2,  0,  UVcoords.x + (size.x / ratio),  UVcoords.y + size.y,
                  size.x / 2,     size.y / 2,   0,  UVcoords.x + (size.x / ratio),  UVcoords.y}

纹理过滤器定义为:

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_NEAREST);

我尝试添加GL_CLAMP_TO_EDGE但没有运气:

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
                   GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
                   GLES20.GL_CLAMP_TO_EDGE);

以下是我的意思:

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个名为"texture or pixel bleeding"或“纹理图集边缘工件”的已知问题。这是由于坐标的舍入,它是区间[0..1]中的浮动值。

减少剧烈伪像的唯一解决方案是在精灵之间引入一些像素填充。我建议你两个选择:

  • here开始创建实用程序以修改现有纹理图集。
  • 使用像this这样的精灵表编辑器创建精灵表格纹理,并在地图集的精灵之间填充。