纹理展开和纹理映射
- 1.Projective Urban Texturing (blender+opengl)
- 2.Text2Tex (xatlas+pytorch3D)
- 3.自己的理解
- 4.纹理展开和纹理映射,它们可逆吗?
前言 :最近突然意识到纹理展开和纹理映射并非一个东西,遂进行了一些了解,认识浅薄,欢迎指正。
1.Projective Urban Texturing (blender+opengl)
这篇文章是用OpenGL来完成纹理映射,用Blender完成纹理展开的。
OpenGL和Blender是如何对应的呢?先来看看整体流程:
在Blender中导入或创建您想要纹理化的3D模型,并设置好相机位置和投影方式。
在Blender中对3D模型进行UV展开,生成一个空白的纹理地图,并保存为图片文件。
在OpenGL中加载3D模型和空白的纹理地图,并将它们绑定到一起。
在OpenGL中使用文章中提供的神经网络和纹理传播模块,根据您选择的真实城市风格,生成并更新纹理地图。
其中,在OpenGL中加载3D模型和空白的纹理地图,并将它们绑定到一起的具体步骤如下:
首先,您需要在OpenGL中加载3D模型。这可以通过使用OpenGL的顶点缓冲区对象(VBO)来完成。VBO是一种用于存储顶点数据的缓冲区对象,可以通过调用glGenBuffers、glBindBuffer和glBufferData等函数来创建和使用。
接下来,您需要在OpenGL中加载空白的纹理地图。这可以通过使用OpenGL的纹理缓冲区对象(TBO)来完成。TBO是一种用于存储纹理数据的缓冲区对象,可以通过调用glGenTextures、glBindTexture和glTexImage2D等函数来创建和使用。
然后,您需要将3D模型和纹理地图绑定到一起。这可以通过调用glBindTexture函数来完成。在调用该函数时,您需要指定要绑定的纹理单元和要绑定的纹理ID。
最后,您需要将纹理坐标传递给着色器程序。这可以通过使用OpenGL的顶点数组对象(VAO)来完成。VAO是一种用于存储顶点属性数据的缓冲区对象,可以通过调用glGenVertexArrays、glBindVertexArray和glVertexAttribPointer等函数来创建和使用。
2.Text2Tex (xatlas+pytorch3D)
3.自己的理解
在纹理展开和纹理映射之间,3D模型是它们之间的纽带。在预处理阶段,渲染出的2D灰模照片中的每个像素点都被映射到3D模型上。同时,在UV展开时,展开后的二维纹理图集中的每个像素点也与3D模型上的一个点一一对应。这样,在生成阶段,2D灰模照片生成的新图片就可以反向传回到3D模型中,然后再从3D模型上传入纹理图集。
纹理展开的作用是有一个地方可以保存生成的纹理,是一种存储形式,这样别人只需要拿到mesh和展开的纹理图集,就能得到带纹理的物体,否则存储纹理可能很费资源;而纹理映射,比如说做纹理生成任务,将渲染出来的灰模在2D上生成纹理后,需要反传回3D模型上,这时候需要计算一个对应函数,这就是纹理映射。
上面是简化的表述,例如二维纹理图和3d像素不能一一对应,用函数的映射来描述比较合适。
4.纹理展开和纹理映射,它们可逆吗?
UV展开可以被视为一个映射(Mapping)过程,它将三维模型表面上的点映射到了二维平面上的UV坐标。这个映射过程是单向的,它将三维坐标映射到了二维坐标,但是不能从二维坐标直接反推回三维坐标,因此UV展开不是一个逆函数。
纹理映射则是将二维纹理图像上的颜色信息映射到了三维模型表面上的过程。在这个过程中,每个顶点都有对应的UV坐标,指示了纹理图像上的位置。这个映射过程是将二维坐标映射到了三维坐标,但是在实际渲染时,使用的是UV坐标,而不是直接使用二维坐标。纹理映射的过程是可逆的,因为你可以根据UV坐标找到纹理图像上的颜色信息,然后将其映射回三维模型表面。
综上所述,UV展开是一个单向的映射过程,而纹理映射是一个可逆的映射过程。它们之间并不是严格的函数和逆函数关系,而是可以理解为映射和逆映射的关系。