【问题标题】:How to use vertex, normal and texture indices together?如何同时使用顶点、法线和纹理索引?
【发布时间】:2013-07-16 11:43:03
【问题描述】:

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

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

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

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

谢谢:)

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

【问题讨论】:

    标签: c++ directx hlsl directx-11


    【解决方案1】:

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

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

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

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

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

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

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

    希望帮助我理解此问题的示例也对您有所帮助。 看看一些基本的 DirectX11 教程,或者如果你可以this 书。

    【讨论】:

    • 是的,这实际上是有道理的。现在对我来说更清楚了,现在知道了这一点,我认为 OBJ 格式还没有准备好直接从 OBJ 导出器读取。我想我会看看其他一些更合适的数据格式。您知道可以推荐的数据格式吗?
    • 我听说 COLLADA 是一个不错的并且具有可读格式 (xml),我自己还没有尝试过,但也许会是你最好的方式。因为我实际所做的是为 Blender 和 3DMax 创建自己的导出器,您可以在我的博客 notnullgothik.blogspot.com 中看到结果,大多数商业引擎将使用他们自己的添加优化和二进制格式的数据,就像我使用的那样。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2012-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多