已經嘗試了所有去除黑空/閃爍屏幕的方式,(2周攪拌後)的問題終於解決了,是給我一個新的教訓。
看來,在OpenGL ES 2.0中,我們不能將緩衝區對象(vbo或ibo)與nio緩衝區混合。代碼應該主要使用緩衝區對象或者只是使用nio。
這是錯誤代碼:
////////////////////////////////
// program for missiles start //
////////////////////////////////
GLES20.glUseProgram(GLES20Renderer._programMissiles);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationMissiles, 3, GLES20.GL_FLOAT, false, 12, GLES20Renderer._pointVFBMissile);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationMissiles);
GLES20.glDrawArrays(GLES20.GL_POINTS, 0, 3);
///////////////////////////////
// program for missiles end //
///////////////////////////////
//////////////////////////////
// program for player start //
//////////////////////////////
GLES20.glUseProgram(GLES20Renderer._programBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[0]);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationBody, 3, GLES20.GL_FLOAT, false, 12, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[1]);
GLES20.glVertexAttribPointer(GLES20Renderer._aColorLocationBody, 4, GLES20.GL_FLOAT, false, 16, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aColorLocationBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[2]);
GLES20.glVertexAttribPointer(GLES20Renderer._aNormalPositionBody, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aNormalPositionBody);
GLES20.glUniform3f(GLES20Renderer._uLightPositionLocationBody, GLES20Renderer._LightPosInEyeSpace[0], GLES20Renderer._LightPosInEyeSpace[1], GLES20Renderer._LightPosInEyeSpace[2]);
GLES20.glUniformMatrix4fv(GLES20Renderer._uMVPLocationBody, 1, false, GLES20Renderer._MVPMatrixBody, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[3]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 372, GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glUseProgram(GLES20Renderer._programNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[0]);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationNozzle, 3, GLES20.GL_FLOAT, false, 12, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[1]);
GLES20.glVertexAttribPointer(GLES20Renderer._aColorLocationNozzle, 4, GLES20.GL_FLOAT, false, 16, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aColorLocationNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[2]);
GLES20.glVertexAttribPointer(GLES20Renderer._aNormalPositionNozzle, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aNormalPositionNozzle);
GLES20.glUniform3f(GLES20Renderer._uLightPositionLocationNozzle, GLES20Renderer._LightPosInEyeSpace[0], GLES20Renderer._LightPosInEyeSpace[1], GLES20Renderer._LightPosInEyeSpace[2]);
GLES20.glUniformMatrix4fv(GLES20Renderer._uMVPLocationNozzle, 1, false, GLES20Renderer._MVPMatrixNozzle, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[3]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 144, GLES20.GL_UNSIGNED_SHORT, 0);
/////////////////////////////
// program for player end //
/////////////////////////////
,這是正確的代碼:
////////////////////////////////
// program for missiles start //
////////////////////////////////
GLES20.glUseProgram(GLES20Renderer._programMissile);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._missileBuffers[0]);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationMissile, 3, GLES20.GL_FLOAT, false, 12, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationMissile);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, GLES20Renderer._missileBuffers[1]);
GLES20.glDrawElements(GLES20.GL_POINTS, 3, GLES20.GL_UNSIGNED_SHORT, 0);
///////////////////////////////
// program for missiles end //
///////////////////////////////
//////////////////////////////
// program for player start //
//////////////////////////////
GLES20.glUseProgram(GLES20Renderer._programBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[0]);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationBody, 3, GLES20.GL_FLOAT, false, 12, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[1]);
GLES20.glVertexAttribPointer(GLES20Renderer._aColorLocationBody, 4, GLES20.GL_FLOAT, false, 16, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aColorLocationBody);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[2]);
GLES20.glVertexAttribPointer(GLES20Renderer._aNormalPositionBody, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aNormalPositionBody);
GLES20.glUniform3f(GLES20Renderer._uLightPositionLocationBody, GLES20Renderer._LightPosInEyeSpace[0], GLES20Renderer._LightPosInEyeSpace[1], GLES20Renderer._LightPosInEyeSpace[2]);
GLES20.glUniformMatrix4fv(GLES20Renderer._uMVPLocationBody, 1, false, GLES20Renderer._MVPMatrixBody, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, GLES20Renderer._bodyBuffers[3]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 372, GLES20.GL_UNSIGNED_SHORT, 0);
GLES20.glUseProgram(GLES20Renderer._programNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[0]);
GLES20.glVertexAttribPointer(GLES20Renderer._aPositionLocationNozzle, 3, GLES20.GL_FLOAT, false, 12, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aPositionLocationNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[1]);
GLES20.glVertexAttribPointer(GLES20Renderer._aColorLocationNozzle, 4, GLES20.GL_FLOAT, false, 16, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aColorLocationNozzle);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[2]);
GLES20.glVertexAttribPointer(GLES20Renderer._aNormalPositionNozzle, 3, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(GLES20Renderer._aNormalPositionNozzle);
GLES20.glUniform3f(GLES20Renderer._uLightPositionLocationNozzle, GLES20Renderer._LightPosInEyeSpace[0], GLES20Renderer._LightPosInEyeSpace[1], GLES20Renderer._LightPosInEyeSpace[2]);
GLES20.glUniformMatrix4fv(GLES20Renderer._uMVPLocationNozzle, 1, false, GLES20Renderer._MVPMatrixNozzle, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, GLES20Renderer._nozzleBuffers[3]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, 144, GLES20.GL_UNSIGNED_SHORT, 0);
/////////////////////////////
// program for player end //
/////////////////////////////