1

我对 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 网格代码,三角形就会显示出来,但是一旦包含它,三角形就会消失。

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

干杯。

4

1 回答 1

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

于 2010-12-10T07:22:18.530 回答