c++ - 具有 nullptrs 或空缓冲区的 DirectX11 IASetVertexBuffers
问题描述
我想构造我的管道,以便每个网格都有可能只设置位置、法线等元素,并且由于某些网格不会拥有所有这些元素,而某些着色器不需要所有这些元素,我希望每个网格都有属性在不同的缓冲区中,现在我不知道是否最好为每个缓冲区调用 SetBuffers 设置索引 x 处的这 1 个缓冲区,或者有可能一次将所有这些设置为数组,但有些会为空(我想保留插槽号)
解决方案
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 在所需参数上显示空指针时会做什么,但我不认为它会很好。
此处更简单的选项是在需要属性但源未提供属性时,为管道中的每个网格提供显式默认值。这样,缺失值就没有问题了。
推荐阅读
- c# - 如何以圆角 WPF 形式创建圆角矩形?
- javascript - JS 新手:如何在 HTML 文档中正确调用递归函数?
- electron - 我可以在 Electron 中使用谷歌标签管理器吗?
- smartsheet-api-2.0 - SmartSheet 是否支持任何 CURL 来获取工作表中的总行数?
- swift - Ho to create single tableview for two UISegment Control with two different selection check mark using Swift?
- c++ - 即使它在我的系统上运行,也会在编程网站上不断收到运行时错误(SIGSEGV)
- python-3.x - 通过 python 脚本发布 Visual Studio Web 应用程序
- sql - 根据 SQL Server 2008 R2 中的最大值删除行
- scala - 宏扩展内的隐式搜索失败
- css - 使用 em 作为宽度和高度的测量单位进行弹性设计