假设我们已经为网格顶点分配了UV坐标,
如何执行纹理烘焙?

我想这将是这样的:

for each coordinate (u, v) in parameter space:
    (x, y, z) = inverse(u, v) # Get the geometric space coordinate.
    f = faces(x, y, z) # Get the corresponding face. We may need face's normal for rendering.
    pixels[u, v] = render(x, y, z, f)


inverse功能是什么?是投影变换还是双线性变换?

以及如何有效地获得一个坐标(u,v)的对应面?

评论

“纹理烘焙”是什么意思?我对该术语的用法不熟悉。

@Calsbeek,将表面上的3d计算转换回2d中的纹理以重新使用。皮克斯(Pixar)有一份论文或技术报告,他们在其中命名。 id搜索您,但在运输途中在电话上进行这些操作有点痛苦。

#1 楼

只需在纹理空间中渲染网格即可完成纹理烘焙。换句话说,您可以设置与纹理大小匹配的渲染目标,并使用顶点着色器绘制网格,该着色器将输出位置设置为顶点的UV坐标(从[0,1] UV空间适当地重新映射为[−1 ,1]投影后空间。

顶点着色器仍可以计算世界空间位置,法线以及其他所需内容,并将其发送到像素着色器。这样,像素着色器就可以做自己的事情,而无需知道它正在渲染到纹理空间而不是通常的屏幕空间。只要正确连接了像素着色器输入,就可以照常进行照明和阴影计算。

您不必执行任何复杂的反转操作;只需执行一次即可。您只需利用GPU栅格化硬件,该硬件很乐意在您选择的任何坐标处绘制三角形。

自然地,这要求您的网格已经具有不重叠的UV贴图,该贴图适合单位平方,但是如果没有这个,纹理烘焙就没有任何意义。

#2 楼

反坐标并非在所有情况下都是平凡的。但是,基本上,对于基本的三角形网格,没有异物,并且没有不重叠的UV,您需要这样的东西:


对于UV坐标,您需要找到对应的UV三角形。 (可以消除步骤,请参见下文)
然后计算重心三角形坐标。大多数光线跟踪器对此都有简单的实现。

从重心坐标到3d,其正好

b1*p1_3d + b2*p2_3d+ b3*p3_3d


其中b是步骤2中的重心线。 p的三角形点向量


如何加快三角形的查找速度。

您可以在O(log(n))时间内进行扫掠搜索。您还可以使用bsp树执行相同的操作。这将产生O(m * log(n))算法,其中m是样本数和n个三角形。听起来不错。

等等,我们可以做得更好!如果不是按顺序烘烤每个像素,而是按顺序烘烤每个三角形,该怎么办?然后,您不必去寻找三角形。在三角形中找到点应该是微不足道的。因此,您可以获得类似于理论上的O(m)算法的信息。取消第1步,从理论上讲应该更容易,至少在理论上应该更快。

在第二种情况下,如果愿意,也可以放弃重心计算,如果愿意,可以使用其他公式。 />


图像1:一次扫描一个多边形更容易,并且不需要搜索有问题的多边形。