Xna 原语的硬件实例

Xna 原语的硬件实例,xna,hardware,Xna,Hardware,我读过关于硬件实例的文章。 我想将其应用于基本体而不是模型。 但我的问题是: 我想画一个由顶点构建的圆(所有圆总共6300个顶点) 是否必须为每个顶点设置变换矩阵? 提前感谢您这是MSDN在GraphicsDevice.DrawInstancePrimitives上要说的话 该方法提供了一种机制,用于以不同频率收集来自不同流的顶点着色器输入数据(通常通过将一个数据流解释为逐实例世界变换);这种方法需要自定义着色器来解释输入数据。有关更多信息,请参见XNA Game Studio 4.0中的Dra

我读过关于硬件实例的文章。 我想将其应用于基本体而不是模型。 但我的问题是: 我想画一个由顶点构建的圆(所有圆总共6300个顶点)

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


提前感谢您

这是MSDN在
GraphicsDevice.DrawInstancePrimitives上要说的话

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

回到你的问题:

我必须为每个顶点设置变换矩阵吗

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

e、 g.由

…您的XNA代码:再次感谢


这就是MSDN在
GraphicsDevice.DrawInstancePrimitives上所说的

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

回到你的问题:

我必须为每个顶点设置变换矩阵吗

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

e、 g.由

…您的XNA代码:再次感谢


非常感谢。我只有一个小问题:我是否需要定义自己的VertexDeclaration,或者我是否能够使用示例VertexExpositionColor@λ表达式的VertexDeclaration?不客气。遗憾的是,我不能肯定这一点。所示示例使用自定义声明,但我不知道是否需要。您好,亲爱的朋友。我想我可以使用自己的vertexbuffer和自己的声明。可能是单独处理的,如您所见“graphicsDevice.SetVertexBuffers(modelVertexBuffer,new VertexBufferBinding(instanceVertexBuffer,0,1));”谢谢您,谢谢!我只有一个小问题:我是否需要定义自己的VertexDeclaration,或者我是否能够使用示例VertexExpositionColor@λ表达式的VertexDeclaration?不客气。遗憾的是,我不能肯定这一点。所示示例使用自定义声明,但我不知道是否需要。您好,亲爱的朋友。我想我可以使用自己的vertexbuffer和自己的声明。可能是单独处理的,正如您所看到的“graphicsDevice.SetVertexBuffers(modelVertexBuffer,new VertexBufferBinding(instanceVertexBuffer,0,1));”谢谢您
float4x4 WorldViewProj;

void InstancingVertexShader(inout float4 position : POSITION0,
                            in float4x4 world : TEXCOORD0)
{
    position = mul(mul(position, transpose(world)), WorldViewProj);
}
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);