基元的硬件实例化

Hardware Instancing for Primitives

我已阅读有关硬件实例化的内容。 我想将它应用于基元而不是模型。 但我的问题是: 我想画一个由顶点构成的圆(所有圆总共有 6300 个顶点)

是否必须为每个顶点设置一个变换矩阵?

提前致谢

这是 MSDN 在 GraphicsDevice.DrawInstancedPrimitives

上的说法

This method provides a mechanism for gathering vertex shader input data from different streams at different frequencies (typically by interpreting one data stream as a per-instance world transform); this approach requires a custom shader to interpret the input data. For more information, see DrawInstancedPrimitives in XNA Game Studio 4.0. Tell me more

回到你的问题:

Do I have to set a transform matrix for every vertex?

不,你不知道。实例(不是每个顶点)将有一个转换,您可以在渲染之前将其绑定到着色器。 model/instance 将有一个描述它在世界中的位置的转换。每个顶点本质上是一个 相对 坐标,描述相对于模型原点的偏移量。

例如由 Shawn Hargreaves Blog

提供
float4x4 WorldViewProj;

void InstancingVertexShader(inout float4 position : POSITION0,
                            in float4x4 world : TEXCOORD0)
{
    position = mul(mul(position, transpose(world)), WorldViewProj);
}

...您的 XNA 代码:再次由 Shawn Hargreaves Blog

提供
instanceVertexBuffer.SetData(instanceTransformMatrices, 0, numInstances, SetDataOptions.Discard);

graphicsDevice.SetVertexBuffers(modelVertexBuffer, new VertexBufferBinding(instanceVertexBuffer, 0, 1));
graphicsDevice.Indices = indexBuffer;
instancingEffect.CurrentTechnique.Passes[0].Apply();

graphicsDevice.DrawInstancedPrimitives(PrimitiveType.TriangleList, 0, 0,
                                       modelVertexBuffer.VertexCount, 0,
                                       indexBuffer.IndexCount / 3,
                                       numInstances);