【发布时间】:2010-07-07 15:03:21
【问题描述】:
只是一个关于绘制四边形的快速问题。我目前正在使用:
GraphicsDevice.DrawPrimitives(PrimitiveType primitiveType,
int startVertex, int primitiveCount);
这可以完美地绘制我的四边形,但我可以让它工作的唯一方法是为我的四边形使用六 (6) 个顶点(将它们绘制为两个三角形)。我只是想知道是否可以为 GPU 提供四 (4) 个顶点并仍然保留我的动态顶点缓冲区。
我知道我可以使用 DrawUserIndexedPrimitives() 做到这一点,但我想要我的缓冲区! ;)
编辑:我是否需要,如果需要,我在哪里告诉我的 GPU 我每两个三角形输入四个顶点?我目前将四边形存储为顶点缓冲区中的 nQuads * 6 个顶点,而我的 GPU 将每三个顶点用作一个三角形。所以只要切换到四个顶点就意味着:
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);
现在,还有更多内容,因为我使用了循环队列和其他一些东西,但这足以理解。
【问题讨论】:
-
我不明白编辑后的部分。为什么是“nQuads * 6”。你说的6倍是什么意思?还有什么不好的?
-
如果我想绘制 10 个四边形,这意味着 60 个顶点,因为我每个四边形有 6 个顶点。从技术上讲,我的 60 个顶点是 20 个三角形。因此,我可以想象我的四边形由六个顶点组成,而实际上它是由三个顶点组成的两个三角形。如果我突然只使用四个顶点而不是六个,一个四边形将由 4/3 个三角形组成,因此彼此重叠。
-
你的四边形是相互连接的还是你想画一个四边形?
-
它们在视觉上没有连接,但它们是同一个缓冲区的一部分,是的。据我了解,GPU 正在使用该缓冲区并使用顶点 1-3、4-6、7-9 等来绘制三角形。如果可以解决问题,我编辑了一些代码:\
标签: c# xna vertex-buffer vertices