2012-11-25 94 views
1

我正在創建一個小型坦克遊戲(渲染器是> 1300行代碼),目前正在研究遊戲中的武器。當我設置gl_PointSize時,我在屏幕上發現意想不到的東西(flickering on the screen or complete black screen),因此武器上的工作變得非常煩人。閃爍的屏幕/由設置引起的完整的黑色屏幕gl_PointSize

這是怎麼發生的以及如何去除這個(OpenGL ES 2.0 vendor: Imagination Technologies, Device: Motorola Milestone, OS: Android 2.3.3)z-fighting可能會成爲問題嗎?

調整setLookAtM不會產生任何效果,除去奇怪效果的唯一方法是刪除gl_PointSize


[UPDATE]

可能gl_PointSize不是問題;在遊戲中有一個坦克,一個房間和一盞燈,並且在對該武器進行調用glDrawArrays的那一刻,屏幕閃爍或者變成完全黑色一段時間(直到我接觸並旋轉坦克),假設該武器在平截頭體內很好。


Matrix.setLookAtM(GLES20Renderer._ViewMatrix, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0); 
    Matrix.frustumM(GLES20Renderer._ProjectionMatrix, 0, -ratio, ratio, -1, 1, 0.75f, 10); 

float[] pointVFA = { 
      3.0f,3.0f,3.0f, 
      -3.0f,3.0f,3.0f, 
      -3.0f,-3.0f,3.0f 
    }; 

    ByteBuffer pointVBB = ByteBuffer.allocateDirect(pointVFA.length * 4); 
    pointVBB.order(ByteOrder.nativeOrder()); 
    GLES20Renderer._pointVFBMissile = pointVBB.asFloatBuffer(); 
    GLES20Renderer._pointVFBMissile.put(pointVFA); 
    GLES20Renderer._pointVFBMissile.position(0); 

private static final String _vertexShaderCodeMissiles = 
     "attribute vec4 aPosition;              \n" 
    + "void main() {                 \n" 
    + " gl_PointSize = 15.0;               \n" 
    + " gl_Position = aPosition;              \n" 
    + "}                    \n"; 
private static final String _fragmentShaderCodeMissiles = 
     "#ifdef GL_FRAGMENT_PRECISION_HIGH            \n" 
    + "precision highp float;               \n" 
    + "#else                   \n" 
    + "precision mediump float;              \n" 
    + "#endif                   \n" 
    + "void main() {                 \n" 
    + " gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);          \n" 
    + "}                    \n"; 

回答

1

已經嘗試了所有去除黑空/閃爍屏幕的方式,(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 // 
    /////////////////////////////