【问题标题】:2D Texture gets distorted when making a sub-pixel translation进行子像素平移时,2D 纹理会失真
【发布时间】:2012-12-24 04:08:08
【问题描述】:

我想知道一个理论推理为什么这是可能的:几何体的平移与纹理映射有何关联。

  • 我只能在进行子像素平移时注意到这种效果,如果平移整个像素,纹理看起来很好。
  • 我使用的是正交投影,GL_CLAMP_TO_EDGEGL_NEAREST,片段着色器是highp
  • 纹理坐标是图集的一个子区域,但即使映射了整个图集,我也能看到失真。
  • 使用 OpenGL ES(Android 和 iOS),但请在重新标记之前谁能解释这在 OpenGL 中不是问题。

我尝试过的事情:

【问题讨论】:

    标签: opengl opengl-es-2.0 textures texture-mapping


    【解决方案1】:

    按亚像素量移动总是会改变纹理采样。您使用最近的采样会影响纹理的采样方式,但不会影响纹理的采样位置。该坐标是 tex 坐标(在多边形上插值)和顶点的函数,它决定了如何将多边形光栅化为屏幕像素。

    请记住,要获得完美的纹理采样,插值的纹理坐标在像素中心进行评估时,必须完全位于纹理中心。

    将多边形移动一个像素的一小部分,从而改变纹理的采样位置,因为像素中心现在位于多边形内略有不同的点。

    现在,通过最近的采样,得到的坐标将有效地四舍五入回到最近的纹素,所以如果你的坐标离中心不远,它可能会起作用。但是,当您的坐标移动了大约半个纹素时,它们正好位于两个纹素几乎等距的点上,那么计算精度上的微小误差就会以一种方式微移一些像素,而另一种微移一些像素。

    这是一个图表。我选择显示一个三角形,并用格子图案进行映射,但它同样适用于精灵或其他任何东西。

    在图表的顶部,我只是展示了三角形是如何映射到纹理的。如果您在非常高分辨率的屏幕(或非常大的尺寸)上渲染此三角形,您会希望看到完全复制的检查模式。

    但是,如果您以更接近的比例(例如 1:1)进行映射,则采样至关重要。在图表的底部,我展示了这种情况。

    要看的关键是屏幕像素中心的位置,因为它决定了绘制哪些像素,以及纹理采样的位置。在这种情况下,我展示了以正确大小映射的多边形,但偏移了半个像素。这会在相邻的纹素之间精确对齐像素中心,并且采样会非常紧张。

    【讨论】:

    • 感谢您的回复。您能否详细说明“该坐标是在多边形上插值的 tex 坐标和顶点的函数,它决定了如何将多边形光栅化为屏幕像素。”我不明白子像素转换后片段着色器中哪些参数会受到影响。
    • 感谢您的努力,很好的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多