我已阅读有关硬件实例化的内容。 我想将它应用于基元而不是模型。 但我的问题是: 我想绘制一个由顶点构建的圆(所有圆共6300个顶点)
我是否必须为每个顶点设置变换矩阵?
提前谢谢
答案 0 :(得分:0)
这就是MSDN对GraphicsDevice.DrawInstancedPrimitives
该方法提供了一种机制,用于从不同频率的不同流中收集顶点着色器输入数据(通常通过将一个数据流解释为每个实例的世界变换);此方法需要自定义着色器来解释输入数据。有关更多信息,请参阅XNA Game Studio 4.0中的DrawInstancedPrimitives。 Tell me more
回到你的问题:
我是否必须为每个顶点设置变换矩阵?
不,你没有。实例(不是每个顶点)将具有在渲染之前绑定到着色器的变换。模型/实例将具有描述其在世界中的位置的变换。每个顶点本质上是一个相对坐标,用于描述模型原点的偏移量。
提供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);