当前位置: 首页 > 知识库问答 >
问题:

顶点数组的问题

刘运浩
2023-03-14

我正在尝试学习如何处理VBO(VertexBufferObjects),但我不能比顶点数组更进一步。我遵循了一些关于这个主题的基本教程,每一个教程都有不同的方式,使我很难理解和执行。

问题:使用gldrawarrays();进行呈现应该与立即模式下的呈现相同。所以我尝试用songho.ca测试代码,但我得到的只是本机代码中的JVM崩溃。问谷歌一点帮助都没有,因为这种方法的几十个变种。但我假设我的参数是主要问题。

以下是我目前得到的信息:

我使用LWJGL,所以我将数据存储在一个floatbuffer中:

FloatBuffer buffer = BufferUtils.createFloatBuffer(triangles.size() * 3 * 3);

for(Triangle tri : triangles) {
    buffer.put((float) tri.getA().x);
    buffer.put((float) tri.getA().y);
    buffer.put((float) tri.getA().z);

    buffer.put((float) tri.getB().x);
    buffer.put((float) tri.getB().y);
    buffer.put((float) tri.getB().z);

    buffer.put((float) tri.getC().x);
    buffer.put((float) tri.getC().y);
    buffer.put((float) tri.getC().z);
}

我的三角形类由3个向量A B C组成,每个向量定义一个顶点。在第一行中,我为顶点分配了空间,每个三角形有9个浮点(每个顶点有3个浮点,每个三角形有3个顶点)。到目前为止没有什么不寻常的,放入缓冲区的浮点数正好等于分配的大小。

以即时模式呈现:

    glBegin(GL_TRIANGLES);
    for (Triangle tri : this.triangles) {
        glVertex3d(tri.getA().x, tri.getA().y, tri.getA().z);
        glVertex3d(tri.getB().x, tri.getB().y, tri.getB().z);
        glVertex3d(tri.getC().x, tri.getC().y, tri.getC().z);
    }
    glEnd();

也没什么特别的,到目前为止看到的一切对我来说都很好。但数组变体让我头疼...

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, 0, buffer);

    glDrawArrays(GL_TRIANGLES, 0, buffer.capacity());

    glDisableClientState( GL_VERTEX_ARRAY );

崩溃的JVM产生的错误日志指向gldrawarrays(GL_TRIANGLES,0,buffer.capacity());行,但我找不到我的错误...

共有1个答案

狄兴邦
2023-03-14

您需要在代码中添加buffer.flip()

Java中的缓冲区有一个内部当前位置,当您调用glvertexpointer(...)时,LWJGL用它来标记数据的开头。每次调用buffer.put(...)时,它都会增加缓冲区的大小,并将当前位置设置为缓冲区的末尾。

调用flip(...)会将当前位置移动到缓冲区的开头。这样,当您尝试绘制capacity(...)-许多顶点从“当前”位置开始时,就不会溢出缓冲区。

此外,每个顶点由3个浮点构建。这里的容量是以浮点组件的数量来衡量的,所以你的缓冲区中存储的顶点数量实际上是它的容量除以3。

 类似资料:
  • 下面的lwjgl3代码设置缓冲区等,用于呈现三角形。我能看到三角形。现在我正努力弄明白到底是怎么回事。 下面是我对代码的理解。我们首先创建一个顶点缓冲区对象,它只是一个数组的容器。glBindBuffer()和glBufferData()使用顶点数组填充顶点缓冲区对象。我们再次对第二个顶点数组执行此操作。然后我们编译顶点和片段着色器,并将它们添加到着色器程序中。不知怎么的,这个程序访问第二个顶点缓

  • 我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null

  • 通过几何体BufferGeometry的顶点索引属性BufferGeometry.index可以设置几何体顶点索引数据,如果你有WebGL基础很容易理解顶点索引的概念,如果没有也没有关系,下面会通过一个简单的例子形象说明。 比如绘制一个矩形网格模型,至少需要两个三角形拼接而成,两个三角形,每个三角形有三个顶点,也就是说需要定义6个顶点位置数据。对于矩形网格模型而言,两个三角形有两个顶点位置是重合的

  • 我正在努力学习LWJGL (OpenGL)不得不说我很艰难。 我试着在窗户上画一个三角形和一个四边形,最后我设法做到了。 但我还有一个问题 如果您觉得这个问题很愚蠢,请提前表示歉意,但我在网上找不到非常详细的教程,所以很难理解,因为这是我第一次使用OpenGL。 话虽如此,这是代码的相关部分: 假设程序以60 fps的速度运行。< br >这意味着渲染方法每秒钟被游戏循环调用60次。 该渲染方法的

  • 顶点数组对象( VAO )是一种特殊类型对象,它封装了与顶点处理器有关的所有数据,它仅仅是记录顶点缓存区和索引缓冲区的引用,以及顶点的各种属性的布局而不是实际的数据。这样做的好处是一旦你为一个 mesh 设置一个 VAO ,你就可以通过简单的绑定 VAO 来导入 mesh 的所有状态。之后你就可以直接渲染 mesh 对象而不需要担心它的状态,VAO 为你记住了它。如果你的程序需要对顶点属性布局不同

  • 2.1节~2.4节通过缓冲类型几何体BufferGeometry给大家讲解了顶点位置、颜色、法向量、索引数据,本节课给大家引入一个新的threejs几何体APIGeometry。几何体Geometry和缓冲类型几何体BufferGeometry表达的含义相同,只是对象的结构不同,Threejs渲染的时候会先把Geometry转化为BufferGeometry再解析几何体顶点数据进行渲染。 Vect