首页 > 解决方案 > 像素化 UV 坐标时是否可以解决舍入问题?

问题描述

我正在开发一个块状体素游戏。我从0fps文章中实现了平滑着色,效果很好。

在此处输入图像描述

今天我决定通过像素化来让它变得不那么平滑。构成三角形带(四边形)的每个顶点都有一个vec4 shadows. 我只是使用 UV 坐标在这 4 个阴影点之间进行双线性插值,否则这些坐标将用于纹理。

float pixelize(float x) { return floor(x*BLOCK_DIMENSION) / BLOCK_DIMENSION; }
float linear(float u, float a, float b) { return a + u*(b - a); }
float bilinear()
{
    float v0 = linear(pixelize(texUV.x), shadows.x, shadows.y);
    float v1 = linear(pixelize(texUV.x), shadows.z, shadows.w);
    return linear(pixelize(texUV.y), v0, v1);
}

但无论我多么努力地捏造它(添加 0.125f 或 0.5f 或其他),我都无法让它完美。像素化偏移 1(注意左侧有 4 个阴影,右侧有 3 个阴影);阴影不是对称的。 在此处输入图像描述

有可能解决这个问题吗?

标签: openglglsl

解决方案


您需要添加0.5到 的结果中floor,如下所示:

float pixelize(float x) { return (floor(x*BLOCK_DIMENSION) + 0.5) / BLOCK_DIMENSION; }

我敢打赌你试图将它添加到其他地方,这是不一样的。

使用下图可以理解这样做的动机:

在此处输入图像描述

第二行的采样在区间内是不对称的,因为floor将所有内容都向下移动。添加0.5恢复了这种对称性。


推荐阅读