您可以使用 IASetVertexBuffers 设置多个顶点缓冲区,但 IASetIndexBuffer 没有复数版本。如果您无法使用单独的索引缓冲区引用它们,那么创建(非交错)多个顶点缓冲区数据的意义何在
(假设我有一个名为 vector3 的结构,带有 3 个浮点 x、y、z)
假设我有一个具有 250.000 个顶点和 1.000.000 个三角形的人类模型;
- 我将为顶点位置创建一个大小为 250.000 * sizeof(vector3) 的顶点缓冲区,并且,
- 我将为顶点法线创建另一个大小为 1.000.000 * 3 * sizeof(vector3) 的顶点缓冲区(并且可能为漫反射纹理创建另一个)
我可以设置这些顶点缓冲区,如:
ID3D11Buffer* vbs[2] = { meshHandle->VertexBuffer_Position, meshHandle->VertexBuffer_Normal };
uint strides[] = { Vector3f_size, Vector3f_size };
uint offsets[] = { 0, 0 };
ImmediateContext->IASetVertexBuffers(0, 2, vbs, strides, offsets);
如果 IASetIndexBuffer 仅支持 1 个索引缓冲区,我如何为这些顶点数据设置单独的索引缓冲区
还有(我知道有一些贴花技术,比如从原始模型创建额外的三角形,但是)假设我想在这个人类模型的脸上(比如说前额)渲染一个像疤痕一样的小纹理,这个疤痕只会通过4 个三角形,是否可以创建一个 uv 缓冲区(只有 4 个三角形)并为仅 4 个三角形的位置、法线和 UV 创建 3 个不同的索引缓冲区,但使用相同的原始顶点缓冲区(来自完整人体模型的相同数据)。我不想创建大量的 uv 数据,这些数据永远不会在字符前额旁边渲染(我不想重复使用,为这个辅助纹理层(贴花)重新创建顶点位置数据)
编辑:我意识到我没有正确提出问题,所以我的问题是:
- 我是否误解了非交错模型结构(是否出于其他原因使用它而不是具有未对齐的顶点组件)?
- 还是我接近非交错结构错误(有没有办法定义多个非对齐顶点缓冲区并仅用一个索引缓冲区绘制它们)?