繁体   English   中英

设置gl_PointSize导致屏幕闪烁/完全黑屏

[英]Flickering of screen/complete black screen caused by setting gl_PointSize

我正在创建一个小型坦克游戏(渲染器> 1300行代码),目前正在研究游戏中的武器。 每当我设置gl_PointSize时,我注意到屏幕上出现意外的东西(flickering on the screen or complete black screen)屏幕上(flickering on the screen or complete black screen)时,武器方面的工作变得非常烦人。

这是如何发生的以及如何删除(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"; 

尝试了所有方法消除黑色空白/闪烁的屏幕(搅拌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  //
    /////////////////////////////

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM