【发布时间】:2013-01-28 04:07:15
【问题描述】:
如何在同一个顶点缓冲区和/或 DeviceContext 中实现每个实例的纹理、顶点着色器和像素着色器?
我只是想找到一种最有效的方法,让相同类型的网格使用不同的像素着色器,但颜色不同。例如,我希望顶点缓冲区中的正方形和三角形模型,并让顶点/像素/等着色器根据实例数据采取不同的行动......(如果实例数据以某种方式包含“死”,则着色器用于使用纯色而不是渐变绘制不透明的形状。
鉴于: 1. Vertex Buffer、Square 和 Triangl 中的不同模型模板(最终更多)。
- 具有 [n] 个方形和/或三角形等类型实例的实例缓冲区。
猜测: 我正在尝试研究的事情:
答:我可以将 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);
【问题讨论】:
标签: directx hlsl directx-11 vertex-shader pixel-shader