我有一些模型(几何)有一些顶点信息。例如位置、法线、颜色、纹理坐标,这些信息中的每一个都有自己的顶点缓冲区。但是其中一些模型有纹理坐标有些没有......为了管理这些差异,我编写了一个顶点着色器,它正在检查常量缓冲区“hasTextureCoordinates”中的标志是否 == 1。如果是这样,它是否使用 texcoord 参数。但是 Directx 并不真正喜欢这种解决方法并打印出:
D3D11 INFO: ID3D11DeviceContext::Draw: Element [3] 在当前输入布局的声明中引用了输入槽 3,但没有缓冲区绑定到该槽。这没关系,因为从空槽读取被定义为返回 0。开发人员也可能知道无论如何都不会使用数据。如果开发人员实际上打算在此处绑定输入缓冲区,这只是一个问题。[执行信息#348:DEVICE_DRAW_VERTEX_BUFFER_NOT_SET]
我不确定每个硬件是否都能正确处理这个问题,而且在输出中看到这个“警告”每一帧也不是很好......我知道我可以编写两个着色器,一个有 texcoods,一个没有 texcoods,但问题是这不是唯一可能缺少的参数……有些有颜色,有些没有,有些有颜色和纹理坐标等等。并且为每个顶点缓冲区输入组合编写一个着色器是极其多余的。这非常糟糕,因为如果我们更改一个着色器,我们也必须更改所有其他着色器。也有可能将着色器的一部分放到不同的文件中并包含它们,但这很令人困惑。
有没有办法说 directx 特定的顶点缓冲区是可选的?或者有人知道这个问题的更好解决方案吗?