我正在使用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端的单独数组中。
答案 0 :(得分:2)
我建议你分析一下最简单的问题;对我来说它只帮助使用了两个正方形(平面,4个三角形),并尝试在两个正方形上正确映射纹理,如图所示。
使用这个简单的例子,你有这些数据:
理论上,这足以描述您的整个数据,但如果您进行测试,则会发现其中一个映射的纹理不会完全映射到其中一个方块上。那是因为对于顶点2和3,你有两个不同的UV坐标集,使用这么少的顶点不可能描述,你需要更多的顶点!
要解决此问题,您从所选的任何导出器收集的数据将在发生此类冲突时复制顶点。对于上面的示例,将需要另外两个顶点,它将为法线生成重复数据,为索引生成2个元素,但现在它将正确描述UV坐标的映射。
最后,对于您的示例,这4个顶点无法完全描述所有UV坐标,然后需要复制一些顶点才能完成UV布局,索引数组将会增长。
对于部件我不确定是否OBJ格式导出器实际上是否准备好读取数据,您可以尝试使用导出器解决它,或者您可以尝试另一种可以导出的格式(我建议您更好)已经采用正确格式的数据可以推送到DirectX11的图形管道中。
希望帮助我理解这个问题的例子对你也有帮助。 看看一些基本的DirectX11教程,或者如果你能this预订。
答案 1 :(得分:1)
在我看来,你需要访问:http://www.rastertek.com/tutdx11.html
看看他们在这里有什么,并给它一个旋转