如何从纹理图像x,y到3d空间进行“反转”纹理映射?

时间:2013-04-28 07:32:06

标签: wpf 3d texture-mapping uv-mapping

我正在使用WPF 3D,但我认为这个问题应该适用于任何3d纹理映射。

假设我有一头牛的模型,我想在母牛身上画一个圆形斑点(我想动态地做这个 - 假设我不知道斑点的位置,直到运行时)。我可以通过对顶点进行着色来实现这一点(顶点根据它们与光点中心的距离来指定颜色),但是如果模型相当低聚,则会产生一个非常锯齿状的圆。

我可以使用像素着色器来完成它,其中着色器根据距离光点中心的距离为每个像素着色。但是假设我无法访问像素着色器(因为我没有使用WPF)。

所以,似乎我想做的是动态创建一个带有圆形图案的纹理,并用它纹理牛。

问题是:当我绘制纹理时,如何知道纹理图像上给定xy坐标对应的模型空间中的3d坐标?

也就是说,假设我已经用纯白色纹理构建了我的模型 - 我已经设置了纹理坐标,完成了纹理贴图,但还没有纹理图像。所以我有这个1000x1000(或者其他)的像素图像,根据预先在模型上设置的一些漂亮的纹理坐标,可以很好地覆盖整个母牛。据我所知,当3D硬件绘制一个给定的三角形时,它使用三角形顶点的纹理坐标来找到图像的相应三角形区域,然后在三角形的表面上进行插值以填充显示的模型像素来自图像三角区域的颜色。

我该如何走另一条路?怎么说,对于纹理图像上给定的xy点,并且给定已经在模型上设置的纹理坐标,模型空间中的3d坐标是什么,一旦纹理映射发生,该图像像素将对应?

如果我有这样的功能,我可以为我的纹理贴图图像着色,使得在母牛的圆心点的一定距离内的所有点(在3d空间中)将获得一种颜色,并且所有点都在该距离之外会得到另一种颜色,我最终会在牛身上留下一个漂亮,清脆的圆形斑点,即使是相对低聚的模型。听起来不错吗?

我明白,给定每个三角形的顶点的纹理坐标,我可以逐步浏览模型中的三角形,在纹理图像上找到相应的三角形,并在该三角形中的纹理像素上进行自己的插值,通过在由顶点确定的3d平面上进行插值。而这听起来并非太多很难。但我只是想了解是否有一些标准的3d概念/功能我可以调用一个现成的函数来给我一个给定纹理xy的模型空间坐标。

2 个答案:

答案 0 :(得分:3)

我最终得到了这个工作。我走在纹理上的每一点(1024 x 1024点)。使用模型的纹理坐标,我确定给定的u,v点位于哪个多边形面(如果有的话)。如果它在一个面内,我得到该面上每个点的模型坐标。然后,我按照此处的描述进行重心插值:http://paulbourke.net/texture_colour/interpolation/

也就是说,对于纹理上的每个u,v点,我使用内部多边形检查来确定它在2D纹理表上的中的哪个四边形然后我在其上使用插值如上面的链接所描述的二维几何,但我没有插入颜色或法线,而是插入三维坐标。

然后,我可以使用3D坐标为纹理上的点着色(例如,根据给定纹理点距离点中心点的模型空间有多远,为母牛上的圆形斑点着色)。然后我可以将纹理应用到模型中,并且它可以工作。

同样,似乎这必须是一个带有名称的标准程序......

一个问题是结果对建模者设置的纹理质量非常敏感。例如,如果母牛上相对较大的四边形对应于纹理图像上的小四边形,则一旦应用纹理,就没有足够的像素来处理该模型四边形内的平滑曲线。你当然可以使用更高分辨率的纹理,例如2048x2048,但是你的循环时间是4倍。

答案 1 :(得分:1)

如果我不误解您的问题,那实际上是一个栅格化过程。在光照贴图中,可能还需要为光照贴图空间中的每个纹理像素找到世界空间中的对应位置和法线,然后烘焙辐照度。 (似乎与您的目标相似)

您可以使用标准的Graphics API来执行此任务,而不用编写自己的实现。让:

  • 纹理大小-> G缓冲区的大小
  • 每个网格三角形的UV->输入阶段的顶点位置vec3(u,v,0)
  • 每个网格三角形的索引->输入阶段的索引
  • 每个网格三角形的位置(和法线等)->输入阶段的属性

在图形管线的光栅化阶段之后,将生成UV三角形内的所有片段,并自动插入已提供的属性。您现在可以在像素着色器中做任何您想做的事!