在Android上使用opengl GLES20为片段着色器添加不同的变量会破坏渲染



我正在尝试在android上渲染三维网格,顶点的位置如下所示:

var positionHandle = GLES20.glGetAttribLocation(program, "vPosition").also {
GLES20.glEnableVertexAttribArray(it)
GLES20.glVertexAttribPointer(
it, 3, GLES20.GL_FLOAT, false, 12, vertexBuffer
)
}

我的顶点着色器:

uniform mat4 uMVPMatrix;
attribute vec4 vPosition;
varying vec4 positionOut;
void main() {
gl_Position = uMVPMatrix * vPosition;
positionOut = vPosition;
}

片段着色器:

varying vec4 positionOut;
precision mediump float;
void main() {
gl_FragColor = vec4(1, 0,1,1);
}

此代码在一台设备上运行良好(OnePlus设备上的Android 9(,但在(Android 10三星Galaxy设备(上不起作用,并且不会引发错误。

如果从片段着色器中移除线varying vec4 positionOut;,则渲染工作正常。问题是,为什么只有可变变量的定义会破坏渲染?我现在不使用这个变量,但我想在下一步中使用它。

根据规范,您的代码无效:

片段语言没有浮点类型的默认精度限定符。因此,对于浮动,浮动点向量和矩阵变量声明,声明必须包含精度限定符或默认的浮点精度必须事先声明。

因此,您要么必须将其声明为例如varying mediump ec4 positionOut;,要么将其放入precision语句的某个范围中。