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