【问题标题】:Problems with Vertex Arrays顶点数组的问题
【发布时间】:2014-04-12 14:52:59
【问题描述】:

我正在尝试学习如何处理 VBO (VertexBufferObjects),但我无法比 Vertex Arrays 更进一步。我遵循了一些关于这个主题的基本教程,每个教程都以不同的方式进行教学,这让我很难理解和实施。

问题:使用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();

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

    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());这一行,但我找不到我的错误...

【问题讨论】:

    标签: java opengl lwjgl vertex-array vertex-array-object


    【解决方案1】:

    您需要将buffer.flip () 添加到您的代码中以完成一件事。

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

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

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

    【讨论】:

    • 似乎可行,我将对其进行更多测试。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多