在 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 对象的主要内容,如果未能解决你的问题,请参考以下文章