【问题标题】:Per Instance Textures, and Vertex And Pixel Shaders?每个实例纹理,以及顶点和像素着色器?
【发布时间】:2013-01-28 04:07:15
【问题描述】:

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

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

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

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


    【解决方案1】:

    如何将纹理、顶点着色器或像素着色器 ID 添加到缓冲区 数据,以便 HLSL 或 InputAssembly 可以确定要使用哪个 Shader 绘制时使用?

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

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

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

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

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

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

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

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

    【讨论】:

    • 我正试图围绕 CPU 与 GPU 着色器进行比较。你说我可以使用 VSSetShader 设置 CPU 着色器,但在上面的代码中,语法是 DeviceContext->VSSetShader ...你说我可以在同一模型上使用不同的着色器,你是否暗示我必须重置InputLayout,但重用相同的模型缓冲区?我稍微编辑了问题描述,希望能澄清一下。谢谢你的周到。
    • 着色器都在 gpu 上执行,当您调用 VSSetShader 并发送着色器字节码时,您会指示您的显卡在下一次绘制调用时应该使用这个特定的顶点着色器。事实上,当然可以用不同的着色器重用相同的模型,输入布局告诉输入组装器(在调用顶点着色器之前)如何组织要从模型中读取并发送到顶点着色器的数据,所以在某些情况下你可以重复使用相同的布局,在某些情况下你不能。
    • 你是不是暗示大多数人是分阶段进行的:初始化阶段:创建缓冲区、SetVertices、SetShaders、SetLayout、DrawInstance;然后循环遍历所有:[UpdateVertices, [Update Shaders, [Set Layout, [DrawInstanced] * 重复绘制实例] * 重复设置布局] * 重复更新着色器] * 重复更新顶点]?您能否一次将所有不同的着色器类型设置到 GPU,这样您就不必一直从 CPU 复制到 GPU,并且在您想要切换着色器时只需更新您的输入布局?还是您提到的每个上下文有 1 个顶点着色器的约束。
    • 初始化是:创建缓冲区/创建布局/创建着色器然后在更新/绘制:分配着色器/布局/几何,如果需要更新几何位置并调用绘制。您不必一直复制着色器,一旦创建它们它们就位于您的 gpu 上(对于缓冲区和布局也是如此),所以 VSSetshader 只是告诉 gpu 使用这个,但它不会上传它(它已经在那里,您只需提供参考)。
    • VSSetShader 不会重新复制,而只是将设备中的特定着色器指向布局?某处是否有着色器的“缓冲区”?有哪些协会? 1个设备:1个上下文; 1个设备:[n]个着色器;上下文:[n] 输入布局;输入布局:[n] 缓冲区...?抱歉,我知道这些都是非常基本的问题,但我在任何地方都找不到这张图。我在 Texture Buffers 上找到了这个,但我想弄清楚如何将它映射到输入布局:msdn.microsoft.com/en-us/library/windows/desktop/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多