每个实例纹理,顶点和像素着色器?

时间:2013-01-28 04:07:16

标签: directx hlsl directx-11 vertex-shader pixel-shader

如何在同一个顶点缓冲区和/或DeviceContext中实现每个实例纹理,顶点着色器和像素着色器?

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

给定: 的 1.顶点缓冲区,Square&中的不同模型模板。 Triangl,(最终)。

  1. 具有Square和/或Triangle等类型的[n]实例的实例缓冲区
  2. 猜测: 的 我正在尝试研究的事情:

    答:我可以在缓冲区数据中添加Texture,VertexShader或PixelShader ID,以便HLSL或InputAssembly可以确定在绘制时使用哪个着色器吗?

    B中。我可以将多个像素和顶点着色器“设置”到DeviceContext中,如何告诉Di​​rectX“切换”渲染时加载的顶点着色器?

    ℃。每种类型的着色器(顶点,像素,外壳等)可以与默认顶点缓冲区中的模型定义/网格相关联多少?

    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);
    

1 个答案:

答案 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)。