3

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

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

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

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

谢谢 :)

PS:我的顶点、法线和纹理数据存储在 cpu 端的单独数组中。

4

2 回答 2

2

我建议您将问题缩小到最简单的情况;对我来说,它只使用了两个正方形(平面,4 个三角形)并尝试在两个正方形上正确映射纹理,如图所示。

在此处输入图像描述

使用这个简单的案例,您可以获得以下数据:

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

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

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

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

对于部分我不确定OBJ格式导出器是否真的抛出准备读取的数据,您可以尝试使用导出器来解决它,或者您可以尝试另一种可以导出数据的格式(我最好推荐给您)已经以正确的格式准备好被推送到 DirectX11 的图形管道中。

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

于 2013-07-17T19:49:50.113 回答
1

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

看看他们在这里有什么并试一试

于 2013-07-17T19:08:10.440 回答