如何在同一个 Vertex Buffer 和/或 DeviceContext 中实现每个实例的纹理、顶点着色器和像素着色器?
我只是想找到最有效的方法来让相同类型的网格使用不同的像素着色器,但颜色不同。例如,我希望顶点缓冲区中的正方形和三角形模型,并让顶点/像素/等着色器根据实例数据采取不同的行动......(如果实例数据以某种方式包含“死”,则着色器用于使用纯色而不是渐变绘制不透明的形状。
给定: 1. Vertex Buffer、Square 和 Triangl 中的不同模型模板(最终更多)。
- 具有 [n] 个方形和/或三角形等类型实例的实例缓冲区。
猜测: 我正在尝试研究的事情:
A:我可以在缓冲区数据中添加 Texture、VertexShader 或 PixelShader ID,以便 HLSL 或 InputAssembly 可以确定在绘制时使用哪个 Shader?
B. 我可以将多个像素和顶点着色器“设置”到 DeviceContext 中吗?如何告诉 DirectX“切换”在渲染时加载的顶点着色器?
C. 每种类型(顶点、像素、外壳等)有多少个着色器可以与默认顶点缓冲区中的模型定义/网格相关联?
D. 我可以在 HLSL 中使用某种着色器选择器吗?
相关 C++ 代码
当我创建一个输入布局时,我是否可以在不指定实际顶点着色器的情况下执行此操作,或者以某种方式指定多个?
NS::ThrowIfFailed(
result = NS::DeviceManager::Device->CreateInputLayout(
NS::ModelRenderer::InitialElementDescription,
2,
vertexShaderFile->Data,
vertexShaderFile->Length,
& NS::ModelRenderer::StaticInputLayout
)
);
当我设置 VertexShader 和 PixelShader 时,如何将它们与 VertexBuffer 中的特定模型相关联?是否可以设置多个?
DeviceManager::DeviceContext->IASetInputLayout(ModelRenderer::StaticInputLayout.Get());
DeviceManager::DeviceContext->VSSetShader(ModelRenderer::StaticVertexShader.Get(), nullptr, 0);
DeviceManager::DeviceContext->PSSetShader(ModelRenderer::StaticPixelShader.Get(), nullptr, 0);