2012-11-25 47 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 // 
    /////////////////////////////