2010-12-10 1 views
1

Я довольно новичок в OpenGl, и у меня проблемы с отображением сетки на основе VBO, смешанной с обычными 3D-объектами. Я могу рисовать текстурированные треугольники самостоятельно, но когда я включаю сетку VBO, треугольники перестают отображаться. Я получаю кратковременную вспышку треугольников, прежде чем они заменяются сеткой - по-видимому, потому, что они отображаются сначала, они появляются в первом кадре перед отключением.Почему рисование моей сетки VBO OpenGL-ES предотвращает отображение других треугольников?

Я пытался отключить все состояния Я включил (и наоборот) и попы всех матриц я сдвинут и т.д. ...

Я развернула 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(); 

так, чтобы повторно шапку, если я удалить код Жеребьевка ВБО GRID отображение треугольников, но как только он включен треугольники исчезают.

Любые идеи, подсказки для чего-то попробовать, направление для меня исследования или что-то в этом роде будут оценены. Не стесняйтесь указывать, если я делаю что-то ненужное или глупое.

Cheers.

ответ

1

Является ли mVertexBuffer клиентским буфером? Если это так, тогда вам нужно отвязать свой VBO. Попробуйте добавить

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0); 

после нанесения вашей сетки VBO. (простите меня, если я не получил синтаксис правильно, я только когда-либо делал OpenGL в C/C++.) Когда VBO привязан, вызовы glVertexPointer() интерпретируются как смещения в вашем VBO. Если VBO не связан, то они понимаются как адрес на клиентской памяти.

Смотрите здесь: http://www.opengl.org/sdk/docs/man/xhtml/glBindBuffer.xml

+0

Спасибо за быстрый ответ Криса, да и это было его вместе с: – 2010-12-10 10:49:17

 Смежные вопросы

  • Нет связанных вопросов^_^