小编WTH*_*WTH的帖子

在DX10/DX11中使用多个顶点缓冲区

我有一个C++ DirectX 11渲染器,我一直在写.

我编写了一个COLLADA 1.4.1加载程序来导入COLLADA数据,用于支持骨架动画.

我现在正在验证装载机(我之前在使用不同技术编写的另一个渲染器中支持COLLADA)我遇到了将COLLADA与DX10/11相匹配的问题.

我有3个独立的顶点数据缓冲区:

唯一顶点位置的顶点缓冲区.唯一法线的顶点缓冲区.唯一纹理坐标的顶点缓冲区.

这些顶点缓冲区包含不同的数组长度(位置有2910个元素,法线有9000多个,纹理坐标大约有3200个.)

COLLADA提供了一个三角形列表,它给出了给定三角形的每个数组的索引(一开始是冗长而奇怪的,但最终一旦你使用它就变得简单了.)

知道DX10/11支持多个顶点缓冲区我认为我将填充带有索引的DX10/11索引缓冲区到每个缓冲区*和*(这是重要的部分),这些索引对于给定的点可能是不同的三角形.

换句话说,我可以设置三个顶点缓冲区,设置正确的输入布局,然后在索引缓冲区中我将相当于:

l_aIndexBuffer[ NumberOfTriangles * 3 ]

for( i = 0; i < NumberOfTriangles; i++ )
{
    l_aIndexBufferData.add( triangle[i].Point1.PositionIndex )
    l_aIndexBufferData.add( triangle[i].Point1.NormalIndex )
    l_aIndexBufferData.add( triangle[i].Point1.TextureCoordinateIndex )
}
Run Code Online (Sandbox Code Playgroud)

有关在DirectX中使用多个顶点缓冲区的文档似乎没有提供有关它如何影响索引缓冲区的任何信息(稍后将详细介绍).

运行代码产生奇怪的渲染结果,我可以看到网格我间歇性地正确绘制(奇怪的多边形,但大约三分之一的点位于正确的位置 - 提示 - 提示)

我想我此时(昨天)搞砸了我的数据或索引,所以我辛苦地验证了这一切,所以我认为我正在搞砸我的输入或其他东西.我通过使用普通和纹理缓冲区中的值来消除这一点,或者设置像素着色器使用的颜色值,颜色是正确的,所以我没有遇到填充问题.

最后我得出结论,DX10/11必须期望以不同方式排序数据,所以我尝试以这种方式存储索引:

indices.add( Point1Position index )
indices.add( Point2Position index )
indices.add( Point3Position index )
indices.add( Point1Normal index )
indices.add( Point2Normal index )
indices.add( Point3Normal index )
indices.add( Point1TexCoord index )
indices.add( Point2TexCoord index )
indices.add( …
Run Code Online (Sandbox Code Playgroud)

directx directx-11 game-engine

5
推荐指数
1
解决办法
2630
查看次数

标签 统计

directx ×1

directx-11 ×1

game-engine ×1