为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?

Posted

技术标签:

【中文标题】为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?【英文标题】:Why does drawing my OpenGL-ES VBO grid prevent other triangles from displaying?为什么绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示? 【发布时间】:2010-12-10 06:55:54 【问题描述】:

我是 OpenGL 的新手,在显示基于 VBO 的网格与普通 3D 对象混合时遇到问题。 我可以自己绘制带纹理的三角形,但是当我包含 VBO 网格时,三角形停止显示。 在它们被网格替换之前,我快速闪现了三角形 - 大概是因为它们首先被渲染,它们在被禁用之前的第一帧中出现。

我尝试禁用所有已启用的状态(反之亦然)并弹出所有已推送的矩阵等...

我展开了 OpenGL 调用以简化代码:


// initial OpenGl setup
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
gl.glShadeModel(GL10.GL_FLAT);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glDisable(GL10.GL_DITHER);
gl.glDisable(GL10.GL_LIGHTING);
gl.glTexEnvx(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glViewport(0, 0, width, height); // width and height of surface


// render loop start

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
final float halfWidth = State.me.viewWidth / 2;
final float halfHeight = State.me.viewHeight / 2;
gl.glOrthof(-halfWidth, halfWidth, -halfHeight, halfHeight, 0.0f, 1.0f);
gl.glScalef(1f, -1f, 1f);


// draw quad        

gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

gl.glTranslatef(x, y, -1.0f);
gl.glRotatef(angle, 0f, 0f, 1f);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, VERTS, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);

gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);          
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
gl.glLoadIdentity();


// draw VBO grid

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
gl.glLoadIdentity();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glEnable(GL10.GL_TEXTURE_2D);

GL11 gl11 = (GL11) gl;
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mVertBufferIndex);
gl11.glVertexPointer(3, mCoordinateType, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, mTextureCoordBufferIndex);
gl11.glTexCoordPointer(2, mCoordinateType, 0, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, mIndexBufferIndex);
gl11.glDrawElements(GL11.GL_TRIANGLES, count, GL11.GL_UNSIGNED_SHORT, startIndex * CHAR_SIZE);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPopMatrix();
gl.glLoadIdentity();

所以重新说一下,如果我删除了绘制 VBO 网格代码,三角形就会显示出来,但是一旦包含它,三角形就会消失。

任何想法、尝试的提示、我研究的方向或任何类似的东西都将不胜感激。 如果我也在做任何不必要或愚蠢的事情,请随时指出。

干杯。

【问题讨论】:

【参考方案1】:

mVertexBuffer 是客户端缓冲区吗?如果是这样,那么您需要取消绑定您的 VBO。尝试添加

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);

在绘制 VBO 网格之后。 (如果我的语法不正确,请原谅我,我只在 C/C++ 中做过 OpenGL。)当绑定一个 VBO 时,对 glVertexPointer() 的调用被解释为你的 VBO 的偏移量。如果没有绑定 VBO,则将它们理解为客户端内存上的地址。

请看这里:http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml

【讨论】:

感谢克里斯的快速回复,是的,就是这样: 啊——请忽略上面的评论失误。感谢克里斯的快速回复,是的,它与 gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);愚蠢的是,我在阅读文档后已经尝试过这个,但是只有第一行解除绑定 GL_ARRAY_BUFFER 我就崩溃了,所以我认为它是错误的并在别处寻找。谢谢你让我回到正确的道路上。这是有道理的,OpenGL 不喜欢在索引缓冲区仍被绑定时让顶点缓冲区未绑定。

以上是关于为啥绘制我的 OpenGL-ES VBO 网格会阻止其他三角形显示?的主要内容,如果未能解决你的问题,请参考以下文章

多个网格、多个 VBO、多个 VAO、OpenGL 4.1

使用 VBO 的 OpenGL 贪心网格划分

OpenGL - 绘制存储在 VBO 中的大量信息

Qtopengl,为啥不能使用不同的vbo绘制两个立方体

VBO 比绘制图元的过时方法慢 - 为啥?

打开 GL ES 2.0 为啥我的 VBO 不工作?