使用OpenGL ES 2.0在Android上旋转相机时,GL_LINES会消失/闪烁

时间:2014-07-02 12:17:24

标签: android opengl-es camera galaxy

在我的Android应用程序中,我使用的是OpenGL ES 2.0,我需要在场景中心显示一个网格。我还有可以围绕场景中心旋转的相机。

我使用GL_LINES和简单的着色器程序渲染网格。

在我拥有的某些设备上,一切正常,但是在一台设备上(特别是Galaxy Note 10.1 2014版)我有问题,当相机旋转时网格线消失/闪烁,即在某些摄像机角度线条不可见。

以下是问题的解决方法:

enter image description here

以下是它应该如何运作:

enter image description here

我注意到,当它们的终点(或起点,不确定)出现在摄像机的平截头体平面后面(即摄像机后面)时,看起来线条开始在某些摄像机角度闪烁。因此,当相机从上方看网格时没有闪烁,当相机从四边或两边看时没有闪烁。

我试图在几天内搜索此问题的解决方案或可能原因,但到目前为止一无所获。所以我决定问你们。我会感谢一些帮助,建议。也许有OpenGL经验的人可以从这个描述中猜出导致问题的原因。

还有一个问题,也许这不是我的代码中的问题,而是特定设备,驱动程序或其他问题?但是我没办法检查这个。我手上只有三个Android设备,可能还不足以得出这样的结论。

在旧款Galaxy Tab 10.1和联想P780手机上都能正常使用。 然而,Galaxy Note 10.1是更新的设备,具有非常大的分辨率(2560 x 1600), 所以我也想,也许它不是因为设备/ GPU驱动程序,而是因为高分辨率?

其他几何体(填充多边形不是线条)渲染得很好。

这是我的代码。

DrawFrame和项目/视图矩阵设置:

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

    GLES20.glLineWidth(1f);

    float screenRatio = (float)viewportWidth / (float)viewportHeight;

    Matrix.setIdentityM(matrixProjection, 0);
    MatrixHelper.perspectiveM(matrixProjection, 0, 90, screenRatio, 0.1f, 1000f);                

    Matrix.setIdentityM(matrixView, 0);

    Matrix.translateM(matrixView, 0, 0f, 0f, -10f);        

    rotationAngle = rotationAngle + (10f * deltaSec);

    Matrix.rotateM(matrixView, 0, 45f, 1f, 0f, 0f);
    Matrix.rotateM(matrixView, 0, rotationAngle, 0f, 1f, 0f);        


    GLES20.glUseProgram(shaderGrid.ShaderProgramId);

    GLES20.glUniformMatrix4fv(shaderGrid.vProjection, 1, false, matrixProjection, 0);
    GLES20.glUniformMatrix4fv(shaderGrid.vView, 1, false, matrixView, 0);

    renderGrid.Draw(shaderGrid, origin); //see code from this method below

画线:

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferIds[0]);                              
    GLES20.glVertexAttribPointer(shader.aPosition, 3, GLES20.GL_FLOAT, false, 0, 0);
    GLES20.glEnableVertexAttribArray(shader.aPosition);        

    float [] m = new float[16];

    Matrix.setIdentityM(m, 0);

    GLES20.glUniformMatrix4fv(shader.vModel, 1, false,  m, 0);            

    GLES20.glDrawArrays(GLES20.GL_LINES, 0,     10 * 2 * 4); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glDisableVertexAttribArray(shader.aPosition);

这是我的着色器代码(抱歉这样的格式=)):

    public String GetShaderFragmentCode()
    {        
        return
          "precision mediump float;" +
          "void main() " +
          "{" +
          "  gl_FragColor = vec4(0.7, 0.7, 0.7, 1.0);" +
          "}";            
    }

    public String GetShaderVertexCode()
    {
        return
          "uniform mat4 vProjection;" +
          "uniform mat4 vModel;" +
          "uniform mat4 vView;" +

          "attribute vec3 aPosition;" +

          "void main() " +
          "{" +
          "  gl_Position = (vProjection * vView * vModel) * vec4(aPosition.xyz, 1.0);" +
          "}";
     }

这是重现问题的最小应用程序(等到网格完全旋转):

Compiled APK

Source code

我不确定它是否真的有帮助,因为它是特定于设备的,但如果您在其他设备上遇到同样的问题,我也会感谢您的反馈。或者,如果您有其他高分辨率设备没有这个问题。

这是随机的东西,我试图看看它是否会影响问题(但没有运气,同样的结果)到目前为止:

  • 禁用/启用GL_CULL_FACE
  • 将glLineWidth显式设置为1f或其他值
  • 使用glDrawElements而不是glDrawArrays
  • 更改相机视锥体zNear(从0.1f到100f)
  • 改变视锥体zFar(从10f到非常大的值)
  • 在着色器代码中将vec3更改为vec4以获取aPosition(并且不使用.xyz进行转换)
  • 使用GL_LINE_STRIP - 看看会发生什么,行仍然消失
  • 使用GL_TRIANGLE_STRIP等 - 多边形不会消失,所以问题特别是线条,但我需要线条

当我准备示例时,我也注意到了这个神器:

enter image description here

当相机旋转并且线条闪烁时,它会出现然后很快消失。

0 个答案:

没有答案