像素化 UV 坐标时是否可以解决舍入问题?

Is it possible to fix rounding issues when pixelizing UV coordinates?

我正在开发一款块状体素游戏。我从 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 个阴影);阴影不对称。

可以解决这个问题吗?

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

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

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

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

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