【发布时间】:2013-09-20 01:03:58
【问题描述】:
我正在为 iOS 绘制一个像素完美的游戏:
问题是每隔几帧我就会看到正在绘制的另一个纹理的随机片段(蓝绿色点漂浮在黑暗中)。首先,我尝试确保四边形完全对齐。接下来,我更改了 Z 缓冲区大小。这些东西似乎都没有帮助。
我正在使用纹理图集,但不幸的是我无法添加填充像素(我见过的一种解决方案)。现在,如果我将纹理坐标从 0,1 更改为 0.005,0.95,问题就会消失,但看起来像垃圾。
此屏幕截图的行为是否暗示了我未绑定的另一个解决方案?请注意,对于精灵艺术,我的过滤模式必须保持 NEAREST,并且当我强制我的角色/相机以整个像素增量移动时问题就消失了(不幸的是,这感觉不如以子像素移动)。
编辑:我还尝试通过像这样计算我的 uv 来对纹素的“中间”而不是边界进行采样:
u = (pixelCoordX + 0.5) / pixelsInTexture
v = (pixelCoordY + 0.5) / pixelsInTexture
但现在一切看起来都失败了。
编辑:即使我不知道如何解决这个问题,我也想了解为什么会出现小数像素坐标而不是整个像素坐标。游戏没有缩放,它只是平移,所以无论我如何偏移纹理图块,它看起来都是相同的宽度——点亮相同数量的像素——而不是执行这种奇怪的环绕。
编辑:在阅读了纹素采样的工作原理之后,我有点理解为什么我所有四边形的非整数位置都会影响纹理......但我找不到一个明确的文档说 OpenGL 是“允许的”在我的绘图调用中指定的范围之外使用 uv 坐标(远小于 [0,1],因为我使用的是纹理图集)。
【问题讨论】:
-
如果使用这些纹理坐标时问题消失了,那么它可能与在适当的纹素中心范围之外进行采样有关。我建议
GL_CLAMP_TO_EDGE -
啊,我用的是GL_CLAMP_TO_EDGE,我忘了提。
-
另外,不要那样做(针对纹素中心进行调整)。在 OpenGL 和 D3D10 中,像素坐标(假设您的意思是
gl_FragCoord?)已经与纹理中心对齐。 -
我不确定为什么会这样,但鉴于您发布的内容,填充像素似乎很可能会解决您的问题。为什么不能添加它们?
-
@racarate:不,OpenGL 从一开始就一直将像素坐标与纹理坐标对齐。在 D3D10 之前,Direct3D 是奇怪的 :)