如何在同一个顶点缓冲区和/或DeviceContext中实现每个实例纹理,顶点着色器和像素着色器?
我只是想找到使用相同类型网格使用不同像素着色器的最有效方法,但颜色不同。例如,我想在顶点缓冲区中使用方形和三角形模型,并且顶点/像素/等级着色器根据实例数据采取不同的行为....(如果实例数据以某种方式包含“死”,则着色器用于使用纯色而不是渐变来绘制不透明的形状。
的给定: 的 1.顶点缓冲区,Square&中的不同模型模板。 Triangl,(最终)。
的猜测: 的 我正在尝试研究的事情:
答:我可以在缓冲区数据中添加Texture,VertexShader或PixelShader ID,以便HLSL或InputAssembly可以确定在绘制时使用哪个着色器吗?
B中。我可以将多个像素和顶点着色器“设置”到DeviceContext中,如何告诉DirectX“切换”渲染时加载的顶点着色器?
℃。每种类型的着色器(顶点,像素,外壳等)可以与默认顶点缓冲区中的模型定义/网格相关联多少?
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);
答案 0 :(得分:0)
如何将Texture,VertexShader或PixelShader ID添加到缓冲区 数据,以便HLSL或InputAssembly可以确定哪个着色器 在抽奖时使用?
您不能将像素着色器ID分配给缓冲区,这不是管道的工作方式。
A /您一次只能在设备上下文中绑定一个顶点/像素着色器,它定义管道,使用此着色器绘制几何体,然后根据需要切换到另一个顶点/像素着色器,绘制下一个几何体。 你可以使用相同的模型使用不同的着色器,但这是使用VSSetShader,PSSetShader在cpu上完成的....C /否,出于与B中相同的原因(在CPU上设置着色器)
当我创建输入布局时,我可以在不指定实际的顶点着色器的情况下执行此操作,还是以某种方式指定多个?
如果你没有指定一个顶点着色器,管道会认为你绘制了“null”几何体,这实际上是可能的(而且非常有趣),但是如果你提供了需要发送的几何体顶点着色器数据,因此运行时可以将几何布局与顶点输入布局相匹配。您当然可以通过多次调用函数来创建多个输入布局(在最坏的情况下,每个顶点着色器/几何一次,但如果两个模型/顶点着色器具有相同的布局,则可以省略它)。
当我设置VertexShader和PixelShader时,如何将它们与VertexBuffer中的特定模型相关联?是否可以设置多个?
绑定所需的一切(Vertex / Pixel着色器,Vertex / IndexBuffer,输入布局)和调用draw(或drawinstanced)。