Android OpenGL ES,形状不显示在设备上,但在模拟器上运行良好?

Android OpenGL ES,形状不显示在设备上,但在模拟器上运行良好?,android,opengl-es,Android,Opengl Es,我遵循了android团队的教程,展示了如何使用OpenGL创建简单的三角形。下面是本教程的一部分。在我开始应用之前,android设备和emulator上的一切都很好 一旦我将字符串vertexShaderCode更改为: private val vertexShaderCode = "uniform mat4 uMVPMatrix;" + "attribute vec4 vPosition;" + "void main() {" +

我遵循了android团队的教程,展示了如何使用OpenGL创建简单的三角形。下面是本教程的一部分。在我开始应用之前,android设备和emulator上的一切都很好

一旦我将字符串vertexShaderCode更改为:

private val vertexShaderCode =
        "uniform mat4 uMVPMatrix;" +
        "attribute vec4 vPosition;" +
        "void main() {" +
        "  gl_Position = uMVPMatrix * vPosition;" +
        "}"

我的android设备上没有显示三角形,这些设备是华为Y2和安卓6.0(API 23)以及索尼和安卓4.4.4。如果知道为什么会发生这种情况,我怀疑添加摄影机视图会以某种方式改变视口外某个地方三角形的位置。如何修复它?

我在不同的设备上遇到类似的显示问题。您可以尝试在trustumm()方法中增加“far”的值:

增加这个参数的值为我解决了这个问题

通常,对于平截头体,可以对纵向和横向方向使用不同的参数值,如:

protected val aspect = widthScreen.toFloat() / heightScreen.toFloat()
...
private fun setPerspectiveProjection() {
    var left = -1.0f; var right = 1.0f
    var bottom = -1.0f; var top = 1.0f
    val near = 1.0f; val far = 145.0f
    if (widthScreen < heightScreen) { // portrait orientation 
        bottom /= aspect
        top /= aspect
    } else { // landscape orientation
        left *= aspect
        right *= aspect
    }
    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far)
}
protected val aspect=widthScreen.toFloat()/heightScreen.toFloat()
...
私人娱乐集透视投影(){
左变量=-1.0f;右变量=1.0f
变量底部=-1.0f;变量顶部=1.0f
val近端=1.0f;val远端=145.0f
如果(宽度屏幕<高度屏幕){//纵向方向
底部/=侧面
顶部/=侧面
}else{//横向
左*=纵横比
右*=方面
}
平截头体(投影矩阵,0,左,右,下,上,近,远)
}

我确实增加了“远”参数,但没有成功,其他一切对我来说都是一样的。然后我尝试将“near”参数改为1f,并通过问题解决了它。截头体(projectionMatrix,0,-ratio,ratio,-1f,1f,1f,7f)正如我所怀疑的,问题出在投影矩阵上,感谢你的提示,我设法修复了它,所以我非常感谢@斯拉夫男孩是我的荣幸。是的,如果近距离值和远距离值有一定的裕度就更好了。通常,对于平截头体,可以对纵向和横向方向使用不同的参数值。补充到答案中。
protected val aspect = widthScreen.toFloat() / heightScreen.toFloat()
...
private fun setPerspectiveProjection() {
    var left = -1.0f; var right = 1.0f
    var bottom = -1.0f; var top = 1.0f
    val near = 1.0f; val far = 145.0f
    if (widthScreen < heightScreen) { // portrait orientation 
        bottom /= aspect
        top /= aspect
    } else { // landscape orientation
        left *= aspect
        right *= aspect
    }
    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far)
}