三维重建纹理映射调研
2022-6-13
| 2023-11-11
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password

纹理映射

纹理映射 (Texture Mapping) 是一种将物体空间坐标点转化为纹理坐标,进而从纹理上获取对应点的值,以增强着色细节的方法。
左:网格模型;右:纹理映射后的模型
左:网格模型;右:纹理映射后的模型
纹理映射有以下四个步骤,但并不是每个都要使用,只是体现纹理映射可以被灵活操控,以获得我们想要的效果。
notion image

1. 投影映射(Projector And Mapping)

投影映射是将三维的空间坐标点转化为二维的纹理坐标点,方法有两种:
  1. Projector
    1. Projector有4种投影方式Plane、Cubic、Cylindrical和Spherical
      notion image
  1. UV Mapping
    1. Projector 只适用于简单情况,对于更复杂的几何体贴图,往往需要用到 UV Mapping:用于将 3 维模型中的每个顶点与 2 维纹理坐标一一对应。

2. 变换函数(Corresponder Function)

2.1. 坐标范围处理

此时得到的有可能是 [0.25,0.3] 这种在 [0,1] 范围内的值,但也有可能超出了 [0,1] 范围,那么需要对范围外的值进行处理,一般有以下几种方法:Repeat、Mirror、Clamp  和 Border。
notion image

2.2. 坐标自由变换

除了对这些超出范围的 uv 值处理,还可以对其施加“变换”,比如旋转,平移,缩放,比如想让纹理随着时间运动起来,那么就可以逐帧变换 uv 值
但要注意的是:对 uv 坐标施加的变换矩阵,往往是实际想要变换的逆矩阵
如:若想让纹理向右偏移 0.5 单位,那么则应该是 u – 0.5 而不是 u + 0.5。就好比是一个窗口去看这张纹理,uv 就是窗口,窗口向左移动,看起来就是纹理向右移动

2.3. 转到纹理空间

在对 uv 进行合理变换之后,其范围都落到了 [0,1],再分别乘以纹理实际的宽高,可得到纹理坐标。比如 uv 坐标为 [0.25,0.3],纹理的宽高为 [256,256],那么相乘可得到 [64,76.8],出现了小数。

3. 纹理采样(Texture Sampling)

  • 屏幕或者画布上的一个单元:pixel。
  • 纹理上的一个单元:texel。
设想一种特殊情况,我们要渲染的物体正面对着我们,刚好画布尺寸与纹理尺寸一致,比如都是 512*512,那么在获取每个 pixel 对应 texel 值时,刚好就能得到整数的纹理坐标,只需要每个 texel 逐个读取即可,不用考虑什么采样与重建。
而实际中,我们会面临纹理过大或者过小两种情况。分两种情况来讨论:
notion image
  1. 纹理分辨率过小,需要放大 (Magnification)
    1. 上采样涉及到重建和采样,重建时需要选择滤波器 (filter):
    2. 最邻近采样 (nearest neighbor):类似 box 滤波器
    3. 双线性采样 (bilinear):类似 tent 滤波器
    4. 三次卷积采样 (cubic convolution):类似 sinc 滤波器的截断近似,因为 sinc 本身是最理想的滤波器,但是宽度是无限,无法实际使用
    5. notion image
      notion image
  1. 纹理分辨率过大,需要缩小 (Minification)
    1. 将高分辨率的纹理贴到低分辨率的画布,即一个 pixel 覆盖了多个 texel。
      • 纹理采样抗锯齿
        • 在放大的情况进行混合时,只考虑了周围四个 texel 的值进行混合,而在缩小的情况中,一个 pixel 覆盖的 texel,个数往往不只 4 个,所以容易出现锯齿。
        • 需要对纹理进行预处理,建立一种数据结构,在采样时尽可能对 pixel 覆盖的 texel 区域的平均值进行估计。
        • 三种抗锯齿的方法
            1. Mipmapping
            1. Summed-Area Table(SAT)
            1. 各向异性过滤 (Anisotropic Filtering)
  1. Texture Representation 纹理表现形式
    1. 有一些方法可以优化处理纹理时的性能
      • 纹理合图(texture atlas)
        • 一般使用这个。
        • 一般程序读取模型的时候,使用的是白模(.obj文件)和纹理合图(.png文件)
      • 纹理数组(texture array)
      • 无绑定纹理(bindless texture)
       

4. 纹理转换

在通过纹理采样获取纹理值后,并不一定直接将纹理值作为颜色使用,还有其他用途,如在 Normal Mapping 中当作法向量使用,在 Bump Mapping 中当作高度偏移使用,所以还需要对纹理值进行相应的转换。

5. 最新论文进展

参考资料

更详细:
  • 三维重建
  • 命令行使用meshroomNeRF原理介绍
    • Giscus
    目录