微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

传递给片段着色器的 uv 坐标是如何计算的?

如何解决传递给片段着色器的 uv 坐标是如何计算的?

我对如何计算传递给片段着色器的 UV 坐标感到困惑。我没有得到我期望的结果。

作为一个实验,我使用 Graphics.Blit 在 Unity 中渲染不同大小的纹理。我创建了一个标准的 Unlit 着色器,并将片段着色器修改为:

float4 frag (v2f i) : SV_Target
{
  return float4(i.uv,1);
}

当我在 256x256 8 位 ARGB 纹理上运行它时,我得到了预期的结果。顶部的绿色分量为 255,然后每个像素递减 1,直到底部为 0。红色分量在最左侧的列中为 0,在最右侧的列中为 255。因此,给定的 UV 在预期范围 0-1 内,包括 0-1

但是当改变目标纹理的大小时,事情开始让我感到困惑。如果目标纹理是 128x128,那么红色和绿色分量从 1 到 254,而不是像我预期的那样从 0 到 255。 16x16 纹理的范围从 8 到 247。同样缺少 0 和 255。

增加大小时,事情也有点混乱。我假设 512x512 纹理将从 0 到 255 开始,渐变上的每个值各有两个,例如 [0,1,...,254,255,255]。相反,我得到了 [0,2,255]

似乎无法保证 UV 将提供包括 0 和 1 的范围,或者值之间的均匀间距。

那么,为什么重要?通常不会,但我使用 UV 来计算当前像素坐标以用于精确调整大小算法,并且如果第一个像素未提供 uv (0,0) 并且最后一个像素未由 (1,1) 然后我找不到源像素坐标,调整大小的图像看起来会移动。

有没有人解释一下如何为不同分辨率计算赋予片段着色器的 UV?有没有办法将给定的 uv 范围归一化为 0-1,中间有可预测的步骤?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。