2

我正在为 iOS 绘制一个像素完美的游戏:

在此处输入图像描述

问题是每隔几帧我就会看到另一个纹理的随机片段被绘制(蓝绿色点漂浮在黑暗中)。首先,我尝试确保四边形完全对齐。接下来,我更改了 Z 缓冲区大小。这些东西似乎都没有帮助。

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

此屏幕截图的行为是否暗示了我尚未绑定的另一种解决方案?请注意,对于精灵艺术,我的过滤模式必须保持 NEAREST,并且当我强制我的角色/相机以整个像素增量移动时,问题就消失了(不幸的是,这感觉不如以子像素移动)。

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

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

但现在一切看起来都失败了。

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

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

4

1 回答 1

2

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

纹理图集上的坐标从 0.0-.1.0f 运行。我在思考 0.0-0.9999f 方面取得了更大的成功

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

视觉辅助

我的纹理映射看起来像:

//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 );
于 2013-09-17T18:55:42.247 回答