【问题标题】:DirectX: What will happen if you bind index buffer but not vertex buffer?DirectX:如果绑定索引缓冲区而不绑定顶点缓冲区会发生什么?
【发布时间】:2017-06-10 17:40:35
【问题描述】:

假设您有一个非空索引缓冲区但没有顶点缓冲区。

当您绑定包含不存在索引的索引缓冲区时(因为没有顶点缓冲区),它会为您创建这些顶点还是会忽略所有无效索引?

在您的顶点着色器中,您可以计算索引顶点的所有位置,以便您在屏幕上实际看到一些东西。

这可能吗?

【问题讨论】:

  • 如果你想发射一些顶点,那么你应该使用几何着色器。
  • 问题是我是否必须生成顶点,即使它们的位置会在着色器中被覆盖。
  • 当你执行索引绘制时,顶点和索引都是着色器的输入参数。
  • 请注意,顶点着色器有其限制,顶点着色器输出最多只能是 16 个 32 位数据

标签: c++ directx hlsl


【解决方案1】:

允许使用没有任何顶点缓冲区边界的索引缓冲区执行绘制,但随后只允许两个语义作为顶点着色器的输入:

SV_VertexID 和 SV_InstanceID(参见 SV Semantics here

任何其他输入都将其值设置为 0

我经常遇到的一个用例是将 StructuredBuffers 用作顶点缓冲区(在 Compute Shader 中处理的顶点),并按照此处的(迷你)示例手动完成获取:

StructuredBuffer<float3> sbPosition : register(t0);
void VS(uint iv : SV_VertexID, out float4 posScreen : SV_Position)
{
    //Fetch vertex
    float3 p = sbPosition[iv];

    posScreen = // mul p by world view projection
}

在另一种情况下,您还可以根据顶点 ID 以程序方式生成位置。

一旦完成 vetex 着色器,顶点索引将被索引缓冲区消耗以形成由拓扑设置的图元。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    相关资源
    最近更新 更多