如何一起使用顶点,法线和纹理索引?

时间:2013-07-17 18:53:59

标签: c++ directx hlsl directx-11

我正在使用C ++和DirectX 11编写一个小型渲染引擎。我已设法使用索引顶点渲染模型。现在我也想支持纹理和顶点法线。我正在使用Wavefront OBJ文件,它使用索引来引用正确的纹理和法线坐标(很像索引顶点)。这是我第一次使用顶点,纹理和法线组合做这样的事情,所以这对我来说有点新鲜。

我面临的问题是顶点,法线和纹理坐标的索引数量不一样,我正在尝试找到一种在顶点着色器中使用所有这些索引的正确方法。为了更清楚地说明问题,我制作了一些图片。

http://oi43.tinypic.com/2cegtih.jpg http://oi39.tinypic.com/33l1o46.jpg

左图像是简单的piramid对象的线框,右图像是其UV坐标布局(piramid的底部位于中心)。在左图中,您可以看到金字塔有4个顶点,因此有4个顶点索引。右侧UV布局有6个UV坐标,因此有6个纹理索引。因为piramid的每个面都有自己的法线,所以只有4个正常指数。

我在搜索SO时发现了this问题,它似乎在理论上有效(我还没有尝试过)。这是解决这类问题的常用方法还是有更好的方法?你会建议我做什么?

谢谢:)

P.S。:我的顶点,法线和纹理数据存储在cpu端的单独数组中。

2 个答案:

答案 0 :(得分:2)

我建议你分析一下最简单的问题;对我来说它只帮助使用了两个正方形(平面,4个三角形),并尝试在两个正方形上正确映射纹理,如图所示。

enter image description here

使用这个简单的例子,你有这些数据:

  • 6个顶点
  • 6 UVs
  • 6个法线(对于每个顶点,即使某些顶点可能共享相同的法线)
  • 12指数

理论上,这足以描述您的整个数据,但如果您进行测试,则会发现其中一个映射的纹理不会完全映射到其中一个方块上。那是因为对于顶点2和3,你有两个不同的UV坐标集,使用这么少的顶点不可能描述,你需要更多的顶点!

要解决此问题,您从所选的任何导出器收集的数据将在发生此类冲突时复制顶点。对于上面的示例,将需要另外两个顶点,它将为法线生成重复数据,为索引生成2个元素,但现在它将正确描述UV坐标的映射。

最后,对于您的示例,这4个顶点无法完全描述所有UV坐标,然后需要复制一些顶点才能完成UV布局,索引数组将会增长。

对于部件我不确定是否OBJ格式导出器实际上是否准备好读取数据,您可以尝试使用导出器解决它,或者您可以尝试另一种可以导出的格式(我建议您更好)已经采用正确格式的数据可以推送到DirectX11的图形管道中。

希望帮助我理解这个问题的例子对你也有帮助。 看看一些基本的DirectX11教程,或者如果你能this预订。

答案 1 :(得分:1)

在我看来,你需要访问:http://www.rastertek.com/tutdx11.html

看看他们在这里有什么,并给它一个旋转