UV和UVW映射到底是什么?


26

为了理解一些基本的3D概念,目前,我试图弄清楚纹理的实际工作方式。我知道UV和UVW映射是将2D纹理映射到3D对象的技术-维基百科告诉了我很多。我在Google上搜索了一些说明,但只发现了以我已经知道它是什么的教程。

根据我的理解,每个3D模型都是由点组成的,几个点会构成一张脸?每个点或面都具有一个辅助坐标,该辅助坐标映射到2D纹理中的ax / y位置吗?还是解包如何操纵模型?

另外,UVW中的W真正起什么作用,它提供了超过UV的作用?据我了解,W映射到Z坐标,但是在什么情况下对于相同的X / Y和不同的Z我将具有不同的纹理,Z零件不可见吗?还是我完全误解了?


1
分别问两个问题
Noob Game Developer 2012年

1
我非常讨厌像@NoobGameDeveloper这样的人,其他所有人都在回答这个问题,而他们所做的只是试图找出问题所在。来吧,让他们问问题,我并不是说没有人应该遵守规则,但是像这样的问题完全可以在这里发布。
Daniyal Azram

Answers:


23

您的理解已经接近。每个3D模型都是由顶点组成的。每个顶点通常定义一个点在空间中的位置,一个法线(用于光照计算)和1个或多个纹理坐标。这些通常被指定为u表示纹理的水平部分,v表示垂直部分。

当对对象进行纹理处理时,这些坐标用于查找要从纹理中绘制的纹理像素或像素。我发现最容易将其视为纹理的左边缘(u = 0)和纹理的右边缘(u = 1.0)以及从纹理的顶部(v = 0)和底部之间的百分比或比率其中(v= 1.0)。它们在顶点之间进行插值,并针对渲染的每个屏幕像素进行查找。它们可以大于或小于这些范围,并且渲染对象时设置的渲染状态指定发生的情况。此选项是CLAMP和REPEAT。夹紧将坐标限制为0或1,从而导致纹理在范围之外的地方涂抹。重复使纹理在范围之外时重复。它实际上与仅获取坐标的小数部分并在其位置使用小数部分相同。

在将纹理坐标应用于对象之前,将它们与纹理矩阵相乘以对其进行一些转换(例如缩放,平移或旋转)。有时会在游戏中对该效果进行动画处理,以使其看起来好像某些东西在对象上移动而不必移动对象本身...纹理只是在对象上滚动。当纹理矩阵乘以纹理坐标时,它将生成2个值,这些值用于查找要绘制的纹理像素(将其称为st)。即使未设置纹理矩阵,它们也会从uv自动生成;这等效于将uv乘以一个单位矩阵。

这是w坐标进入的地方,尽管它并不常用。它是将纹理矩阵与之相乘的一个额外参数,通常在您要考虑透视时使用(例如,在“ 阴影贴图”中)。它的工作原理与通过世界视图投影矩阵将对象空间中的位置转换为屏幕空间时相同。通过将UVW与投影变换相乘,最终得到2个坐标,即st,然后将它们映射到2D纹理上。


值得一提的是OpenGL将v0视为底部,将v1.0视为顶部。过去,当我的纹理看起来很奇怪时,我找不到错误,这花了我很多时间。
tkausl 2014年

8

考虑一个三角形。

每个角都有一个UV坐标。您可以在这些像素之间进行插值以获得每个像素的一组UV坐标。(这里也有一些观点,但是暂时不考虑它)。

然后,您从坐标U和V从纹理中获取纹理像素。也就是说,从纹理坐标x,y中获取像素-同一件事,因为我们在谈论纹理,所以术语稍有不同。

如果您的纹理是真正的3维纹理,则还需要第三个坐标W。

可视化的一种方法是考虑一块木头。如果以某种方式将其切碎,您将看到块内的每个平面都包含2D的各种纹理。

3d纹理非常罕见,您暂时可以忘记它们。


罕见?它们是用来干什么的?您能否在AAA标题的上下文中显示一些示例。
Quazi Irfan

不,因为通常来说它们从未使用过。总是有一些更便宜的方法来完成相同的事情。想想wii sports plus中切碎的物品;您可以按照任何希望的方式破坏这些物品,并查看“内部物品”。通过使它们具有3d纹理(假设硬件甚至支持该纹理),它们本可以浪费大量的内存,但是使用几个2d纹理来模拟它们要便宜得多。
Jari Komppa

那么,它们不是排他性的吗?还是对于游戏引擎而言,这并不需要太多功能?
Quazi Irfan,

我不明白你的意思。3d纹理可能在其他用途​​中有用,而不仅仅是简单的纹理。如果着色器需要方便地将某些数据映射到3d数组中,那将是一种用途。但是作为“正常”纹理,它们通常只是浪费内存。
贾里·康帕

3D纹理的一种应用是距离贴图,尽管正如Jari所说,由于其复杂性,它们在游戏中并不常见。[链接] http.developer.nvidia.com/GPUGems2/gpugems2_chapter08.html
中Jackalope

7

想折纸。

UV贴图就像3D网格(壳)的平整(展开)的2D皮肤。

如果要剪裁地图并沿网格线折叠,则结果将是3d模型。

(U,V)浮点值的范围是(0,0)到(1,1)UV贴图的左上角是(0,0)右下角是(1,1)

多边形(tris / quads)网格中的每个顶点都有一个(U,V)值,该值告诉渲染器要使用地图的哪一部分。

在GPU管道中,顶点着色器计算这些3D多边形中每个像素的2D投影,然后片段着色器使用UV贴图为它们着色。

没有这样的图片,就无法完全理解它:

紫外线网

正如其他评论者所提到的,渲染器将W组件用于更高级的效果,例如阴影贴图,但是UV贴图是理解的基础。

请注意,顶点着色器必须为每个需要着色的像素至少调用一次片段着色器。这就是为什么GPU是具有数十个内核的并行处理器的原因-着色器管道要求很高。

另请注意,集成有CPU的GPU是为移动设备设计的,其内核数少于同类外部GPU的十分之一。这是由于移动电源和散热的限制。摩尔定律似乎已经放慢了,但性能仍在改善(到处都是奇怪的崩溃……)

每秒以240+帧的速度将数十亿像素的UV贴图会引起真正的混乱!


0

uv贴图将网格中的点(x,y,z)映射到纹理图像中的点(u,v)。由于图像将(u,v)映射为颜色,因此可以将两个映射链接起来,从而生成从网格空间到颜色空间的映射。

         uv map       color map
 (x,y,z)   ->   (u,v)    ->     color
 mesh           Texture
 space          space
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.