DirectX:如果绑定索引缓冲区而不绑定顶点缓冲区会发生什么情况?
DirectX: What will happen if you bind index buffer but not vertex buffer?
假设您有一个非空索引缓冲区,但没有顶点缓冲区。
当您绑定包含不存在的索引的索引缓冲区时(因为没有顶点缓冲区),它会为您创建这些顶点还是会忽略所有无效索引?
在您的顶点着色器中,您可以计算索引顶点的所有位置,这样您就可以在屏幕上实际看到一些东西。
这可能吗?
允许在没有任何顶点缓冲区边界的情况下使用索引缓冲区执行绘制,但是仅允许两种语义作为顶点着色器的输入:
SV_VertexID 和 SV_InstanceID(参见 SV 语义 here)
任何其他输入都将其值设置为 0
我经常遇到的一个用例是将 StructuredBuffers 用作顶点缓冲区(在计算着色器中处理顶点),并按照此处的(迷你)示例手动完成提取:
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 着色器完成,顶点索引将被索引缓冲区消耗以形成由您的拓扑设置的图元。
假设您有一个非空索引缓冲区,但没有顶点缓冲区。
当您绑定包含不存在的索引的索引缓冲区时(因为没有顶点缓冲区),它会为您创建这些顶点还是会忽略所有无效索引?
在您的顶点着色器中,您可以计算索引顶点的所有位置,这样您就可以在屏幕上实际看到一些东西。
这可能吗?
允许在没有任何顶点缓冲区边界的情况下使用索引缓冲区执行绘制,但是仅允许两种语义作为顶点着色器的输入:
SV_VertexID 和 SV_InstanceID(参见 SV 语义 here)
任何其他输入都将其值设置为 0
我经常遇到的一个用例是将 StructuredBuffers 用作顶点缓冲区(在计算着色器中处理顶点),并按照此处的(迷你)示例手动完成提取:
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 着色器完成,顶点索引将被索引缓冲区消耗以形成由您的拓扑设置的图元。