基元的硬件实例化
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 将有一个描述它在世界中的位置的转换。每个顶点本质上是一个 相对 坐标,描述相对于模型原点的偏移量。
提供
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);
我已阅读有关硬件实例化的内容。 我想将它应用于基元而不是模型。 但我的问题是: 我想画一个由顶点构成的圆(所有圆总共有 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 将有一个描述它在世界中的位置的转换。每个顶点本质上是一个 相对 坐标,描述相对于模型原点的偏移量。
提供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);