Небольшой вопрос по рисованию квадрациклов. В настоящее время я использую:
GraphicsDevice.DrawPrimitives(PrimitiveType primitiveType,
int startVertex, int primitiveCount);
Это отлично рисует мои квадраты, но единственный способ заставить его работать - это использовать шесть (6) вершин для моих квадратов (рисуя их как два треугольника). Мне просто интересно, можно ли накормить GPU четырьмя (4) вершинами и при этом сохранить мой динамический буфер вершин.
Я знаю, что могу сделать это с помощью DrawUserIndexedPrimitives (), но мне нужен свой буфер! ;)
Изменить: нужно ли мне, и если да, где я могу сообщить своему графическому процессору, что я скармливаю ему четыре вершины на два треугольника? В настоящее время я храню свои квадраты как вершины nQuads * 6 в буфере вершин, а мой графический процессор использует каждые три вершины как треугольник. Таким образом, простое переключение на четыре вершины означает:
Quads: {v1,v2,v3,v4} {v5,v6,v7,v8} ...
Triangles: {v1,v2,v3} {v4,v5,v6} {v7,v8 ...}
Это нехорошо, поскольку в треугольнике номер два используется одна вершина из первого четырехугольника, в третьем - две из второго четырехугольника, и так далее и так далее.
Редактировать 2: Извините, я действительно использую динамический буфер вершин.
Публикуем код о том, как я делаю свои квадроциклы с шестью вершинами:
// ## CONSTRUCTION
// Setting up buffer and vertex holder.
particleVertexBuffer = new DynamicVertexBuffer(graphicsDevice,
ParticleQuad.VerticesSizeInBytes * nMaxParticles,
BufferUsage.WriteOnly);
particleVertices = new ParticleVertex[nMaxParticles * 6];
// ## ADD VERTICES
particleVertices[i].Set();
particleVertices[i+1].Set();
particleVertices[i+2].Set();
particleVertices[i+3].Set();
particleVertices[i+4].Set();
particleVertices[i+5].Set();
// ## SET BUFFER
particleVertexBuffer.SetData(particleVertices, 0, nMaxParticles * 6, SetDataOptions.NoOverwrite);
graphicsDevice.Vertices[0].SetSource(particleVertexBuffer, 0, ParticleVertex.SizeInBytes);
// ## DRAW
graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList,
FirstUsedParticle * 6, ((LastUsedParticle - FirstUsedParticle)+1)* 2);
Теперь об этом немного больше, потому что я использую круговую очередь и немного других вещей, но этого было бы достаточно для понимания.