像素化 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
可恢复对称性。
我正在开发一款块状体素游戏。我从 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
可恢复对称性。