【问题标题】:OpenGL 2D Game Texture ArtifactsOpenGL 2D 游戏纹理工件
【发布时间】: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 是奇怪的 :)

标签: ios opengl-es


【解决方案1】:

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

纹理图集上的坐标范围为 0.0-.1.0f。我在 0.0-0.9999f 方面取得了更大的成功

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

Visual Aid

我的纹理映射看起来像:

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

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2019-04-02
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多