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

如何同时使用顶点、法线和纹理索引? 我用C++和DirectX 11编写了一个小型的渲染引擎。我已经设法使用索引顶点渲染模型。现在我还想支持纹理和顶点法线。我使用的是波阵面OBJ文件,它使用索引来引用正确的纹理和法线坐标(很像索引顶点)。这是我第一次把顶点、纹理和法线结合起来做这样的事情,所以这对我来说有点新鲜,c++,directx,hlsl,directx-11,C++,Directx,Hlsl,Directx 11,我面临的问题是,顶点、法线和纹理坐标的索引数量不同,我正在尝试找到一种在顶点着色器中使用所有这些索引的正确方法。为了更清楚地说明这个问题,我制作了一些图片 左侧图像是简单的piramid对象的线框,右侧图像是其UV坐标布局(piramid底部位于中心)。在左图中,您可以看到piramid有4个顶点,因此有4个顶点索引。右UV布局有6个UV坐标,因此有6个纹理索引。因为皮拉明的每一面都有自己的法线,所以只有4个法线指数 我在搜索SO的过程中发现了这个问题,从理论上讲似乎是可行的(我还没试过)。

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

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

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

谢谢:)


注意:我的顶点、法线和纹理数据存储在cpu端的单独阵列中。

啊,在我看来,您需要访问:


看看他们这里有什么,让它旋转一下

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

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

  • 6个顶点
  • 6紫外线
  • 6条法线(对于每个顶点,即使某些顶点可能共享相同的法线)
  • 12指数
理论上,这足以描述整个数据,但如果进行测试,它会发现其中一个贴图纹理不会完全映射到其中一个正方形上。这是因为对于顶点2和3,你有两个不同的UV坐标集,不可能用这么少的顶点来描述,你需要更多的顶点

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

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

对于我不确定的部分,如果OBJ格式导出器确实抛出了准备读取的数据,您可以尝试使用导出器来解决它,或者您可以尝试另一种格式(我更好地向您推荐),该格式可以导出已采用正确格式的数据,准备将其推送到DirectX11的图形管道中

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

是的,这实际上是有意义的。现在我更清楚了,现在知道了这一点,我认为OBJ格式还不能直接从OBJ导出器中读取。我想我会看看其他更合适的数据格式。你知道你可以推荐的数据格式吗?我听说COLLADA是一种很好的数据格式,并且有一种可读的格式(xml),我自己还没有尝试过,但可能是你最好的选择。因为我实际上是为Blender和3DMax创建了自己的导出器,你可以在我的博客notnullgothik.blogspot.com中看到结果,大多数商业引擎都会使用自己的添加优化和二进制格式的数据,就像我使用的那样。