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

标签 android opengl-es 3d vbo

我是 OpenGl 的新手,在显示混合了普通 3D 对象的基于 VBO 的网格时遇到了问题。 我可以自己绘制带纹理的三角形,但是当我包含 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 网格代码,三角形就会显示,但一旦包含它,三角形就会消失。

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

干杯。

最佳答案

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

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);

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

参见此处:http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml

关于android - 为什么绘制我的 OpenGL-ES VBO 网格会阻止显示其他三角形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406442/

相关文章:

c++ - 查看动画网格的截锥体剔除

java - TextView 为空

algorithm - 何时避免曲面重建

android - 在 Android 上创建 SSL 连接时出现 SSLPeerUnverifiedException

iphone - Opengl 着色器问题 - 奇怪的光反射伪影

android - 将月球着陆器转换为使用 Opengl

c++ - OpenGL ES 3 (iOS) 纹理奇怪 - 想知道为什么

openCV 3D 矩阵/直方图的高斯模糊/平滑

java - 安卓 : HashMap is showing only last array item in a Listview field

android - 如何将对话框的位置设置为用户单击 MapView 的位置?