OpenGL 2D游戏纹理工件

时间:2013-09-15 23:32:49

标签: ios opengl-es

我正在绘制一款适合iOS的像素完美游戏:

enter image description here

问题在于我每隔几帧看到另一个纹理的随机碎片被绘制(蓝绿色的小圆点漂浮在黑暗中)。首先,我尝试确保四边形完全排列。接下来,我改变了Z缓冲区大小。这些事情似乎都没有帮助。

我正在使用纹理图集,但不幸的是我无法添加填充像素(我见过的一种解决方案)。现在,如果我将纹理坐标从0更改为0.005,0.95,问题就会消失,但它看起来像垃圾。

此屏幕截图的行为是否表明我没有绑定的其他解决方案?请注意,我的过滤模式必须保持最近的精灵艺术,并且当我强制我的角色/相机以整个像素增量移动时问题消失(遗憾的是感觉不像移动子像素那样好)。

编辑:我也试过通过像这样计算我的紫外线来对纹素的“中间”进行采样而不是边界:

u = (pixelCoordX + 0.5) / pixelsInTexture
v = (pixelCoordY + 0.5) / pixelsInTexture

但现在一切都看起来很糟糕。

编辑:即使我无法弄清楚如何解决这个问题,我也想了解为什么它出现在小数像素坐标而不是整个像素坐标上。游戏不是缩放,它只是平移,所以无论我多么微小地偏移纹理的瓷砖,它似乎是相同的宽度 - 点亮相同数量的像素 - 而不是执行这种奇怪的包装。

编辑:在阅读了texel采样如何工作之后,我有点理解为什么我所有四边形的非整数位置都会影响纹理...但我找不到一个明确的文档说OpenGL是“允许的”在我的绘图调用中指定的范围之外使用uv坐标(因为我正在使用纹理图集,所以它远小于[0,1])。

1 个答案:

答案 0 :(得分:2)

手工制作纹理地图集很难做到!我遇到了同样的问题。如果纹理图集中的所有纹理都是方形的,这可能会有所帮助:

纹理图集的坐标从0.0-.1.0f开始。我有更多的成功思考0.0-0.9999f

在我的情况下,我在256x256像素的纹理中使用16x16像素方块,这给了我16行和列。 1/16 = 0.0625。第一个纹理坐标将从0.0开始并在下一个纹理开始之前结束,因此: 0.0624 。纹理2从0.0625开始,到0.1249结束,依此类推。这样做已经从下一个纹理中删除了那些小斑点。

Visual Aid

我的纹理maping看起来像:

//texture 1
{{0.0624f, 0.9376f},
{0.0624f, 0.9999f},
{0.0f, 0.9999f},
{0.0f, 0.9376f}},

//texture 2
{{0.1249f, 0.9376f},
{0.1249f, 0.9999f},
{0.0625f, 0.9999f},
{0.0625f, 0.9376f}}

另外,请确保您正在使用:

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