在 jogl 中渲染大型 VBO 对象

Posted

技术标签:

【中文标题】在 jogl 中渲染大型 VBO 对象【英文标题】:Rendering large VBO objects in jogl 【发布时间】:2015-05-07 08:44:48 【问题描述】:

我正在尝试渲染包含 ~700000 个值的大型 VBO 数组对象,并且我的 element_array 缓冲区中有 ~1500000 个值。但我得到的是一个空白屏幕。另一方面,如果我只使用 VAO,我的代码可以正常工作。我的代码如下:

    //Data buffers
    FloatBuffer vertexBuffer = GLBuffers.newDirectFloatBuffer(this.coordCount);
    vertexBuffer.put(Vertices);
    vertexBuffer.rewind();

    IntBuffer indexBuffer = GLBuffers.newDirectIntBuffer(this.indexCount);
    indexBuffer.put(index);
    indexBuffer.rewind();

    //setting up the VBO
    int nVBO = 2;
    int[] VBO = new int[nVBO];

    gl.glGenBuffers(nVBO, VBO,0);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO[0]);
    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER,VBO[1]);

    gl.glBufferData(GL.GL_ARRAY_BUFFER, this.coordCount*Float.SIZE, vertexBuffer, GL.GL_STATIC_DRAW);
    gl.glBufferData(GL.GL_ELEMENT_ARRAY_BUFFER, this.indexCount*Integer.SIZE, indexBuffer, GL.GL_STATIC_DRAW);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, VBO[0]);
    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, VBO[1]);

    gl.glEnableClientState(GLPointerFunc.GL_VERTEX_ARRAY);

    gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);
    //gl.glVertexPointer(3, GL.GL_FLOAT, 0, vertexBuffer);


    //gl.glDrawArrays(GL.GL_TRIANGLE_STRIP, 0, 4);
    gl.glDrawElements(GL.GL_TRIANGLES, this.indexCount, GL.GL_UNSIGNED_INT, 0);
    //gl.glDrawElements(GL.GL_TRIANGLES, this.indexCount, GL.GL_UNSIGNED_INT, indexBuffer);


    gl.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
    gl.glBindBuffer(GL.GL_ELEMENT_ARRAY_BUFFER, 0);

关于如何解决此问题的任何线索/建议?

【问题讨论】:

它适用于 small VBO 对象吗? 是的,我已经尝试了 50 个三角形,并且它正在为此工作。但不适用于大型数据集。 您使用的是什么 GPU?您正在运行软件仿真吗? 您是否确保应用程序不会在加载数据时简单挂起? 这是显卡型号:01:00.0 VGA 兼容控制器:Advanced Micro Devices, Inc. [AMD/ATI] Whistler [Radeon HD 6730M/6770M/7690M XT] (rev ff)跨度> 【参考方案1】:

每次循环运行时都会调用这个代码块吗?如果是,您应该将您的 vbo 阶段划分为不同的块。This sample code 可以帮助您如何划分。 (在我发布的链接中,您应该只关注 initVBO 和 renderVbo 函数)我猜您按顺序初始化 vbo,这可能会使您的程序无响应。

【讨论】:

以上是关于在 jogl 中渲染大型 VBO 对象的主要内容,如果未能解决你的问题,请参考以下文章

JOGL/OpenGL VBO - 如何渲染顶点?

在 netbeans 7.4 上运行 jogl VBO

opengl vbo 纹理

OpenGL 使用单个 VBO 渲染多个对象,并使用另一个 VBO 更新对象的矩阵

如何为大型网格实现 VBO 并获得流畅的动画?

JOGL 没有渲染任何东西