原始硬件实例

时间:2015-11-09 19:42:56

标签: xna hardware

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

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

提前谢谢

1 个答案:

答案 0 :(得分:0)

这就是MSDN对GraphicsDevice.DrawInstancedPrimitives

所说的话
  

该方法提供了一种机制,用于从不同频率的不同流中收集顶点着色器输入数据(通常通过将一个数据流解释为每个实例的世界变换);此方法需要自定义着色器来解释输入数据。有关更多信息,请参阅XNA Game Studio 4.0中的DrawInstancedPrimitives。 Tell me more

回到你的问题:

  

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

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

e.g。由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);