如何在顶点缓冲区数组中制作一组多边形的多个副本?

Posted

技术标签:

【中文标题】如何在顶点缓冲区数组中制作一组多边形的多个副本?【英文标题】:How do I make multiple copies of a set of polygons in a Vertex Buffer Array? 【发布时间】:2015-08-24 21:13:39 【问题描述】:

在 OpengL 1 中,在带有 OpenTK 的 Visual Basic 中,如果我想将一百个立方体全部排列成圆形,我会写

glRef = GL.GenLists(1)
GL.NewList(glRef, ListMode.Compile)
GL.Begin(PrimitiveType.Traingles)

GL.Vertex3....for the vertices of a cube

GL.End()
GL.EndList()

这会给我 glRef 作为我可以做的句柄

For i = 0 to 100
    GL.PushMatrix()
    GL.Rotate(3.6*i, 0, 0, 1)
    GL.Translate(5.0, 0.0, 0.0)
    GL.CallList(glRef)
    GL.PopMatrix()
Next

然后把一百个立方体排成一个圆圈。

如何在 Open GL 2.0 或更高版本中使用顶点缓冲区对象做同样的事情?

我开始

GL.GenBuffer(VBOid) 
Dim VertexArray() As Single = ....for the vertices of a cube 

然后将它绑定到顶点缓冲区

GL.BindBuffer(BufferTarget.ArrayBuffer, VBOid(0))
GL.BufferData(BufferTarget.ArrayBuffer, SizeOf(GetType(Single)) * VertexArray.Count, VertexArray, BufferUsageHint.StaticDraw)
GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, False, 0, VertexArray)

然后在我的绘图程序中,我按照以下方式做一些事情

GL.EnableClientState(ArrayCap.VertexArray)
GL.BindBuffer(BufferTarget.ArrayBuffer, PrimitiveID(0))
GL.DrawElements(PrimitiveType.Triangles)

但此时添加第二个 DrawBuffer 命令和变换似乎并没有为我创建第二个立方体。我一直把头撞在墙上,在互联网上到处找,我找不到一个直接的参考来告诉我怎么做,甚至确认它是可能的。

这不是它应该的工作方式,我只是应该发送一百组立方体顶点,还是有办法复制顶点缓冲区对象并对其应用变换? (或者我可能在某个地方做错了,我需要继续寻找错误 - 任何提示都会有所帮助)

【问题讨论】:

【参考方案1】:

我认为GL.DrawBuffer 在这个地方不是正确的命令。它用于在 FBO 的上下文中指定可以写入哪些附着点。

由于您尝试在这里绘制 VBO,我希望使用 GL.DrawArraysGL.DrawElements

【讨论】:

是的,很抱歉它应该是其中任何一个,它在我的代码中的 DrawElements,但为了解释的目的,我在这里对其进行了大量简化。我已经对其进行了编辑以反映这一点。鉴于此,知道如何在 VBO 中克隆对象吗?

以上是关于如何在顶点缓冲区数组中制作一组多边形的多个副本?的主要内容,如果未能解决你的问题,请参考以下文章

在无向图中查找多边形

OpenGL/C++:使用顶点缓冲区进行从后到前渲染

使用增强几何缓冲区缩放多边形时的冗余顶点

如何在 iOS 中制作 OpenGL ES 帧缓冲区的副本?

在 Metal 中从顶点缓冲区渲染四边形

深度缓冲区不使用多个着色器程序