如何将纹理图像的x,y坐标反向映射到3D空间中?

4
我正在使用WPF 3D,但我认为这个问题适用于任何3D纹理映射。假设我有一头奶牛的模型,我想在奶牛上绘制一个圆形斑点(我希望这是动态的——即假设直到运行时我都不知道斑点的位置)。我可以通过着色顶点来实现这一点(基于它们与斑点中心的距离来分配颜色),但如果模型的多边形比较少,那么将会得到一个相当锯齿状的圆形。我可以使用像素着色器来完成这个工作,其中着色器根据每个像素到斑点中心的距离对每个像素进行着色。但是假设我没有访问像素着色器的权限(因为在WPF中我没有),所以我想要做的就是动态地创建一个具有圆形图案的纹理,并用它来渲染奶牛。问题是:当我绘制纹理时,如何知道给定纹理图像上的xy坐标对应于模型空间中的哪个3d坐标?也就是说,假设我已经用纯白纹理对模型进行了纹理贴图——我设置了纹理坐标,完成了纹理映射,但还没有纹理图像。因此,我有一个1000x1000(或其他)像素的图像,根据模型预先设置的一些很好的纹理坐标,在奶牛上漂亮地展开。我知道,当3D硬件要绘制给定的三角形时,它使用三角形顶点的纹理坐标来找到相应的三角形区域,并在三角形表面上插值,以用来自该三角形区域的颜色填充显示的模型像素。那么我该如何反过来?换句话说,对于我的纹理图像上的这个给定的xy点,和已经在模型上设置好的纹理坐标,一旦进行纹理贴图,这个图像像素将对应于哪个模型空间中的3d坐标?如果我有这样一个函数,我可以着色我的纹理映射图像,使所有距离奶牛上圆心点一定距离内的点(在3D空间中)获得一种颜色,而所有距离外部的点都获得另一种颜色,最终我会得到一个漂亮、清晰的圆形斑点,即使是在一个相对低多边形的模型中。听起来没错吧?我确实了解,可以通过模型中每个三角形的纹理坐标,遍历模型中的三角形,在纹理图像上找到相应的三角形,并通过对顶点点确定的3D平面进行插值来完成一些自己的插值。这听起来并不太难。但我只是想知道是否存在一些标准的3D概念/函数,我可以调用一个现成的函数来获取给定纹理坐标的模型空间坐标?

我不知道任何标准方法。但是我可能会从当前视角绘制UV贴图。所以,不是绘制实际的颜色,而是绘制纹理坐标。然后你可以在渲染图像中画圆,查找纹理坐标并在纹理中绘制相应的像素。我不太熟悉WPF 3D,但我认为如果没有直接访问DirectX,则很难实现这一点。 - Nico Schertler
顺便提一下,一旦您获得了坐标,您不必绘制到原始纹理中,而是可以绘制到第二个纹理中,该纹理在其他方面是透明的,并将其作为第二层材质叠加在原始纹理上。 - hbarck
你在纹理上有一个二维点,想要获取它所映射到的三维空间中的点。但这是不可能的——可能会有成千上万个包含该纹理点的三维点。所有的三角形都可以将相同的纹理部分映射到它们上面。 - Ivan Kuckir
伊万,你说得对,通常一个纹理点可以映射到任意数量的模型点。然而,在我的情况下,我正在使用一种“良好行为”的纹理,就像你在覆盖带有面部和头发的3D头部时使用的常规纹理一样。 - M Katz
2个回答

3
我最终成功地解决了这个问题。我走遍纹理上的每个点(1024 x 1024个点)。使用模型的纹理坐标,我确定给定的u,v点位于哪个多边形面内(如果有的话)。如果在一个面内,我就获取该面上每个点的模型坐标。然后按照这里描述的方法进行重心插值:http://paulbourke.net/texture_colour/interpolation/ 也就是说,对于纹理上的每个u,v点,我使用内部多边形检查来确定它在2D纹理表上的哪个四边形中,然后我在相同的2D几何图形上使用上述链接中描述的差值,但是我不是插值颜色或法线,而是插值3D坐标。
然后,我可以使用3D坐标来为纹理上的点着色(例如,基于给定纹理点在模型空间中与点中心之间的距离来着色奶牛的圆形斑点),然后将纹理应用到模型上,这样就可以实现目标。
再次强调一下,这似乎必须是一种具有名称的标准程序...
一个问题是结果对模型师设置的纹理质量非常敏感。例如,如果奶牛上的相对较大四边形对应于纹理图像上的小四边形,则没有足够的像素来在应用纹理后在该模型四边形内获得平滑曲线。当然,您可以使用更高分辨率的纹理,例如2048x2048,但是您的循环时间将增加4倍。

三角形在UV空间中重叠也是可能的,这种情况下问题无法完美解决。 - Joan Charmant

1
如果我没有误解你的问题,实际上这是一个光栅化过程。在光照贴图中,人们可能还需要找到每个光照贴图空间中的像素对应的世界空间中的位置和法向量,然后进行辐射烘焙(这似乎类似于您的目标)。
您可以使用标准的图形API来完成此任务,而不是编写自己的实现。让:
- 纹理大小 -> G缓冲器大小 - 每个网格三角形的UV -> 输入阶段的顶点位置vec3(u,v,0) - 每个网格三角形的索引 -> 输入阶段的索引 - 每个网格三角形的位置(和法线等)->输入阶段的属性
在图形管道的光栅化阶段之后,会生成位于UV三角形内的所有片段,并自动插值已提供的属性。现在您可以在像素着色器中随心所欲!

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