UV和ST纹理坐标之间的区别

26

什么是UV纹理坐标和ST纹理坐标的区别?

我知道在OpenGL中使用UV和ST。

我也知道ST在Java中也被使用。


2
我知道在OpenGL中使用UV和ST。但是,OpenGL规范从未提到过UV。 - Nicol Bolas
2
@NicolBolas 例如,在OpenGL 4.3规范中有8.7方程式。 - kusma
5个回答

37

它们的意思是一样的,只是命名方式不同。

U = S = x dimension
V = T = y dimension

1
实际上,在计算机图形学中,您使用一对这些坐标来表示纹理空间中的位置,另一对则在对象空间中。不同的API有时会混淆或以不同的方式使用它。 - Arne
1
@Arne 从未听说过这个。你能引用一下来源吗? - Stefan Hanke
1
@StefanHanke 嗯,我找了一下,但没找到。也许我记错了。不管怎样,这只是术语。我发现Blinn的凹凸贴图论文非常好,可以理解纹理映射和纹理空间操作(http://research.microsoft.com/apps/pubs/default.aspx?id=73939)。 - Arne
7
一个小细节:通常 U 和 V 的取值范围为 [0, 0] 到 [w, h],而 ST 的取值范围为 [0, 0] 到 [1, 1]。至少在 OpenGL 中是这样定义的,纹理矩形除外。 - kusma
7
Kusma,那不对。UV是纹理坐标,因此也应该在0到1之间。ST可以超过1.0,但通常会被包装到UV空间中。 - Richard Lalancette
显示剩余3条评论

35

《计算机图形学原理与实践》(Foley等)对纹理映射的定义如下:

纹理映射可分为两步。简单的方法是先将像素的四个角点映射到表面上。对于双三次贝塞尔曲面,这种映射自然地定义了表面(s,t)坐标空间中一组点。接着,将表面(s,t)坐标空间中像素的角点映射到纹理(u,v)坐标空间中。纹理映射中的四个(u,v)点定义了一个四边形,近似于像素由于表面曲率而实际映射到的更复杂的形状。我们通过加权求和在四边形内所有纹素的值来计算像素的值,每个纹素的权重由其在四边形内所占比例决定。如果在(u,v)空间中的变换点超出了纹理映射,则可以将纹理映射看作是被复制的,就像第2.1.3节中的模式一样。我们可以将0到1的(s,t)矩形的四个角点与(u,v)中的一个四边形相对应,而不总是使用(s,t)和(u,v)之间的恒等映射。 当表面为多边形时,通常直接将纹理坐标赋值给其顶点。


1
非常好。所以有一个区别。根据包装的不同,两个不同的ST对可以给出相同的UV对。ST是表面坐标,UV是一旦它们被包装后的纹理坐标。 - Richard Lalancette
3
没问题。我指的是OpenGL ES 2.0规范第3.7节有关纹理的部分。(S, T)是一个规范化的片段坐标对,(U, V)则可以视为纹理数组在像素中的宽度和高度。这些术语不应互换使用。 - dturvene

9

uv坐标从左上角开始(v轴向下)。
st坐标从左下角开始(t轴向上)。

s = u;
t = 1-v;

我忘了告诉你,在OpenGL中加载纹理时应该垂直翻转,因为行数据的第一个元素“对应纹理图像的左下角”,详情请参见(glTexImage2D)。只有在这种情况下,st和uv坐标才是相同的。


10
我认为UV坐标不是从左上角开始的,而是和OpenGL中的其他坐标系统一样从左下角开始。 然而,一些图像格式将它们的数据存储在底部,这就迫使你要么翻转图像,要么假装坐标系从左上角开始。 - maja
非常感谢,1-v 修复了我在Maya转three.js导出器中的问题。 :D - kungfooman

3

这是一种约定俗成的问题。

Autodesk 3D Studio、Alias Maya、NewTek Lightwave 及可能还有其他软件使用字母 U 和 V 来分别表示纹理坐标的水平和竖直方向。同样,DirectX 也遵循这个惯例。

而 Pixar 的 RenderMan 则将字母 U 和 V 保留为其参数化 3D 图元的参数。因此,在进行纹理映射时,他们使用字母 S 和 T。OpenGL 在纹理坐标方面也采用了这个约定。

所以从理论上讲它们的含义可能不同,但是,除非你在从事好莱坞电影特效方面的工作,否则它们都代表纹理坐标。


2

STQ是纹理坐标系,在需要透视校正或扭曲时必须使用,它与齐次纹理坐标uv的关系如下:

u =(像素中的图像宽度)* S / Q

v =(像素中的图像高度)* T / Q

当不需要透视校正时,Q = 1.0,因此ST仅成为uv的标准化版本,并且它们之间的差异变得微妙,因此一些3D系统完全跳过uv符号,只使用st / STQ用于齐次/标准化。

Original Answer翻译成"最初的回答"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接