在我的Android应用程序中,我使用的是OpenGL ES 2.0,我需要在场景中心显示一个网格。我还有可以围绕场景中心旋转的相机。
我使用GL_LINES和简单的着色器程序渲染网格。
在我拥有的某些设备上,一切正常,但是在一台设备上(特别是Galaxy Note 10.1 2014版)我有问题,当相机旋转时网格线消失/闪烁,即在某些摄像机角度线条不可见。
以下是问题的解决方法:
以下是它应该如何运作:
我注意到,当它们的终点(或起点,不确定)出现在摄像机的平截头体平面后面(即摄像机后面)时,看起来线条开始在某些摄像机角度闪烁。因此,当相机从上方看网格时没有闪烁,当相机从四边或两边看时没有闪烁。
我试图在几天内搜索此问题的解决方案或可能原因,但到目前为止一无所获。所以我决定问你们。我会感谢一些帮助,建议。也许有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);" +
"}";
}
这是重现问题的最小应用程序(等到网格完全旋转):
我不确定它是否真的有帮助,因为它是特定于设备的,但如果您在其他设备上遇到同样的问题,我也会感谢您的反馈。或者,如果您有其他高分辨率设备没有这个问题。
这是随机的东西,我试图看看它是否会影响问题(但没有运气,同样的结果)到目前为止:
当我准备示例时,我也注意到了这个神器:
当相机旋转并且线条闪烁时,它会出现然后很快消失。