iphone - OpenGL纹理图集出血

标签 iphone opengl-es 2d sprite textures

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

enter image description here

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

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);

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

u0 = float(x) / float(texWidth);
v0 = float(y) / float(texHeight);
u1 = float(x+w) / float(texWidth);
v1 = float(y+h) / float(texHeight);

其中 w 和 h 是没有填充的图 block 的大小。

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

enter image description here

据我了解,我应该用半个纹素偏移 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);

还是不行。这是正确的方法吗?我需要混合才能发挥作用吗?如果我偏移图 block 以确保它们对齐到像素网格,它会起作用,但这会使其在缓慢移动时对齐。人们通常如何解决这个问题?

编辑

我应该说它是在 iPhone 上。

最佳答案

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

这就是你如何“欺骗”边框上纹理采样器的包装。

关于iphone - OpenGL纹理图集出血,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7894802/

相关文章:

iphone - CAAnimation -1 重复计数?

javascript - 如何在 webgl 着色器中仅模糊图像的边缘

ios - SpriteKit : Collisions with 300 nodes, FPS 非常低

java - 2d 游戏相机

iphone - 如何在 subview 中处理 UITapGestureRecognizer?

iphone - 如何在 UIView 的深层层次结构中检测 UIImageView 上的触摸事件?

iphone - 如何从我的应用程序启动 iPhone 设置应用程序?

iphone - 单色触摸 : Enable Multisampling in OpenGL ES 2. 0

android - 前置摄像头2 API GLSurfaceview

2d - Godot 使元素跟随鼠标