Это то, что MSDN должен сказать относительно GraphicsDevice.DrawInstancedPrimitives
Этого метод обеспечивает механизм для сбора вершинного шейдера входных данных из разных потоков на разных частотах (обычно путем интерпретации одного поток данных как глобальное преобразование для каждого экземпляра); этот подход требует, чтобы пользовательский шейдер интерпретировал входные данные. Для получения дополнительной информации см. DrawInstancedPrimitives в XNA Game Studio 4.0. Tell me more
Возвращаясь к вашему вопросу:
Должен ли я установить преобразование матрицы для каждой вершины?
Нет, вы этого не сделаете. Экземпляр (а не каждая вершина) будет иметь преобразование, которое вы связываете с вашим шейдером перед рендерингом. Модель/экземпляр будет иметь преобразование, описывающее его положение в мире. Каждая вершина по существу относится к координате , описывающей смещение от начала координат модели.
например. любезно 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);
Спасибо! У меня есть только один маленький вопрос: мне нужно определить собственное VertexDeclaration или я могу использовать VertexDeclaration экзамена VertexPositionColor –
@ λExpression. Добро пожаловать. Я не уверен в этом. Пример, показанный здесь (http://blogs.msdn.com/b/shawnhar/archive/2010/06/17/drawinstancedprimitives-in-xna-game-studio-4-0.aspx), использует пользовательскую декларацию но я не знаю, требуется ли это. – MickyD
Howdy дорогой друг. Я думаю, что могу использовать свой собственный vertexbuffer с собственным объявлением. Вероятно, это обрабатывается отдельно, так как вы можете увидеть «graphicsDevice.SetVertexBuffers (modelVertexBuffer, новый VertexBufferBinding (instanceVertexBuffer, 0, 1)); В любом случае, спасибо –