【问题标题】:Texture sampling precision problem in OpenGL ESOpenGL ES中的纹理采样精度问题
【发布时间】:2020-03-17 08:29:42
【问题描述】:

我在 Android 上的 OpenGL ES 中采样纹理时遇到问题。我正在采样的对象是一个地形图块,纹理坐标是根据每个顶点的 x-z 位置生成的。对于典型的图块,纹理坐标的范围在 -5 和 5 之间(这意味着我的纹理应该在地形图块上重复 10 次)。

当我查看在 Android 上运行的着色器时,它在图块的中心看起来完全没有问题,但在纹理坐标较大的边缘,我发现我认为是采样中的精度问题:

这正常吗?如果是这样,我应该将我的纹理坐标限制在什么范围内以防止它发生? 0比1?我现在只是将原始纹理坐标(-5 到 5)作为 float2 直接发送到着色器中。纹理为 512x512。

还要注意,我没有在着色器中手动设置精度;它们是从 HLSL 代码自动生成的。我正在使用 MonoGame 来执行此操作。

【问题讨论】:

    标签: android opengl-es textures precision


    【解决方案1】:

    将其夹在 [0; 1] 范围可能有问题,程序内容更容易瞄准 [0;2) 范围。

    无论如何,它不应该是纹理坐标值的某个确切范围,[-5;5] 也应该可以工作。重要的是尺寸关系,纹理的 0 和 1 坐标在屏幕空间中的距离。如果你拉伸纹理以覆盖屏幕上的几个虚拟“公里”,那么精确度确实会有困难。单个屏幕上的多边形在纹理空间内的跨度非常短,需要更多位来插入纹理坐标。

    从减少在世界上延伸的纹理开始。

    【讨论】:

    • 对于浮点数,请始终尝试钳制到 [-1,1),因为您利用符号位来保持比 [0,2) 更高的精度。
    • 感谢各位的回答。只是为了让你知道,我已经尝试了只取 TexCoords 小数部分的典型技巧,但我遇到了由 mipmapping 引起的接缝(也是典型的)问题。夹紧 [-1, 1) 会避免这个问题吗?
    • @user3621637 纹理图像相对于屏幕区域的当前比例是多少?
    • 目前,一个 512x512 的纹理覆盖了 100m 的区域。屏幕区域为 1024x600。
    • @user3621637 不是像素,大小关系是什么?您的纹理覆盖 100m,相机附近的屏幕宽度有多少米?不是观看深度,而是在相机剪裁平面上以“米”为单位的屏幕宽度。
    猜你喜欢
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多