纹理映射 (u,v) 值

texture mapping (u,v) values

以下是 Peter Shirley 的计算机图形学基础的摘录:

11.1.2 Texture Arrays

We will assume the two dimensions to be mapped are called u and v. We also assume we have an nx and ny image that we use as the texture. Somehow we need every (u,v) to have an associated color found from the image. A fairly standard way to make texturing work for (u,v) is to first remove the integer portion of (u,v) so that it lies in the unit square. This has the effect of "tiling" the entire uv plane with copies of the now-square texture. We then use one of the three interpolation strategies to compute the image color for the coordinates.

我的问题是:(u,v)的整数部分是多少?我以为 u,v 是 0 <= u,v <= 1.0。如果有整数部分,我们是否应该将 u,v 除以纹理图像的宽度和高度以获得归一化的 u,v 值?

UV 值可以小于 0 或大于 1。删除整数部分的原因是 UV 值在索引纹理时使用小数部分,其中 (0,0), (0,1), ( 1,0) 和 (1,1) 对应于纹理的角。允许 UV 值超过 0 和 1 是使 "tiling" 效果起作用的原因。

例如,如果您有一个矩形,其角使用 UV 点 (0,0)、(0,2)、(2,0)、(2,2) 进行索引,并假设纹理是设置平铺矩形,然后将在该矩形上绘制四个纹理副本。

UV 值的整数部分的含义取决于环绕模式。以OpenGL为例,至少有3种环绕模式:

  • GL_REPEAT - 整数部分被忽略,没有任何意义。这就是当 UV 值超过 0 和 1 时允许纹理平铺的原因。
  • GL_MIRRORED_REPEAT - 如果整数部分为奇数,则镜像小数部分。
  • GL_CLAMP_TO_EDGE - 大于 1 的值被限制为 1,小于 0 的值被限制为 0。

Peter O 的回答非常好。我想补充一点,图形中使用的坐标系是人们只是作为事实上的标准坚持的惯例——这里没有自然法则,它是任意的(但谢天谢地,这是一个不错的标准)。我认为纹理映射经常令人困惑的原因之一是该标准的任意性并不明显。这就是图像在单位正方形[0,1]^2上有一个事实上的坐标系。给我单位正方形上的 (u,v),我会告诉你图像中的一个点(例如,(0.2,0.3) 是从图像左下角向右 20% 和向上 30% ).但是,如果你给我一个在 [0,1]^2 之外的 (u,v),比如 (22.7, -13.4) 怎么办?一些规则用于在 [0.1]^2 上实现,所描述的 GL 模式只是处理这种情况的各种有用的技巧。