首页 > 解决方案 > 具有 nullptrs 或空缓冲区的 DirectX11 IASetVertexBuffers

问题描述

我想构造我的管道,以便每个网格都有可能只设置位置、法线等元素,并且由于某些网格不会拥有所有这些元素,而某些着色器不需要所有这些元素,我希望每个网格都有属性在不同的缓冲区中,现在我不知道是否最好为每个缓冲区调用 SetBuffers 设置索引 x 处的这 1 个缓冲区,或者有可能一次将所有这些设置为数组,但有些会为空(我想保留插槽号)

标签: c++3drenderingdirectx-11vertex-buffer

解决方案


IASetVertexBuffers允许您在一次调用中指定一组缓冲区:

ID3D11DeviceContext* Context; // Initialized at creation
ID3D11Buffer* buffers[] = /* Initialized to a set of buffers, unused buffers set to null. */;
UINT Strides[] = /* Initialized to the size of each element in each buffer. */;
UINT Offsets[] = /* Initialized to the offset into each buffer, typically all zeros. */; 
Context->IASetVertexBuffers(0, ARRAYSIZE(buffers), buffers, Strides, Offsets);

有关每个参数的更多信息,请参阅文档

请注意,这要求所有着色器的输入布局与管道中可能存在的所有网格相匹配,如果您的着色器需要比网格提供的更多参数,这可能会使事情复杂化。我不确定 DirectX/GPU 在所需参数上显示空指针时会做什么,但我不认为它会很好。

此处更简单的选项是在需要属性但源未提供属性时,为管道中的每个网格提供显式默认值。这样,缺失值就没有问题了。


推荐阅读