OpenGL纹理图集出血

use*_*952 6 iphone textures 2d opengl-es sprite

我正在尝试从纹理图集中绘制一个由较小的瓷砖组成的基本2d地面网格(请注意1像素透明边框):

在此输入图像描述

我使用以下代码将tile渲染为纹理四边形:

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, m_texture);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glVertexPointer(2, GL_SHORT, 0, &m_coords[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &m_uvs[0]);

glDrawArrays(GL_TRIANGLES, 0, m_coords.size() / 2);

glBindTexture(GL_TEXTURE_2D, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

这些位置显然是整数坐标.角的UV坐标计算如下:

u0 = float(x) / float(texWidth);
v0 = float(y) / float(texHeight);
u1 = float(x+w) / float(texWidth);
v1 = float(y+h) / float(texHeight);
Run Code Online (Sandbox Code Playgroud)

其中w和h是没有填充的瓷砖的大小.

当模型视图变换被捕捉到整数位置(右)时看起来很棒,但是当它开始移动时,我会在图块之间得到黑色东西(左):

在此输入图像描述

根据我的理解,我应该用半个纹素偏移UV坐标以使其工作,但是如果我将UV计算更改为:

u0 = float(x+0.5f) / float(texWidth);
v0 = float(y+0.5f) / float(texHeight);
u1 = float(x+w-0.5f) / float(texWidth);
v1 = float(y+h-0.5f) / float(texHeight);
Run Code Online (Sandbox Code Playgroud)

它仍然无法正常工作.这是正确的方法吗?我需要混合才能使用吗?如果我偏移了瓷砖以确保它们被捕捉到像素网格它可以工作,但这会使它在移动缓慢时快速捕捉.人们通常如何解决这个问题?

编辑

我应该说它是在iphone上.

Han*_*esh 5

您的边框不应该是透明的,而是每个子纹理的相对侧的像素.例如,每个子纹理右侧的边框应该是最左边的像素行的副本,即它将环绕到的像素.

这就是你如何"欺骗"包装边框上的纹理采样器.