0

如何在同一个 Vertex Buffer 和/或 DeviceContext 中实现每个实例的纹理、顶点着色器和像素着色器?

我只是想找到最有效的方法来让相同类型的网格使用不同的像素着色器,但颜色不同。例如,我希望顶点缓冲区中的正方形和三角形模型,并让顶点/像素/等着色器根据实例数据采取不同的行动......(如果实例数据以某种方式包含“死”,则着色器用于使用纯色而不是渐变绘制不透明的形状。

给定: 1. Vertex Buffer、Square 和 Triangl 中的不同模型模板(最终更多)。

  1. 具有 [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);
4

1 回答 1

0

如何将 Texture、VertexShader 或 PixelShader ID 添加到缓冲区数据,以便 HLSL 或 InputAssembly 可以确定在绘制时使用哪个 Shader?

您不能将像素着色器 ID 分配给缓冲区,这不是管道的工作方式。

A / 您一次只能在设备上下文中绑定一个顶点/像素着色器,它定义了您的管道,使用此着色器绘制几何图形,然后根据需要切换到另一个顶点/像素着色器,绘制下一个几何图形...

B/您可以使用相同模型的不同着色器,但这是在 cpu 上使用 VSSetShader、PSSetShader 完成的......

C/否,原因与 B 相同(在 CPU 上设置着色器)

当我创建一个输入布局时,我是否可以在不指定实际顶点着色器的情况下执行此操作,或者以某种方式指定多个?

如果您不指定顶点着色器,则管道将认为您绘制“空”几何图形,这实际上是可能的(并且非常有趣),但有点脱离上下文,如果您提供几何图形,则需要发送顶点着色器数据因此运行时可以将您的几何布局与顶点输入布局相匹配。您当然可以通过多次调用该函数来创建多个输入布局(在最坏的情况下,每个顶点着色器/几何图形一次,但如果两个模型/顶点着色器具有相同的布局,则可以省略它)。

当我设置 VertexShader 和 PixelShader 时,如何将它们与 VertexBuffer 中的特定模型相关联?是否可以设置多个?

你绑定你需要的一切(顶点/像素着色器、顶点/索引缓冲区、输入布局)并调用draw(或drawinstanced)。

于 2013-01-29T16:41:08.303 回答