在 Android 上使用 opengl GLES20 向片段着色器添加可变变量会破坏渲染

adding varying variable to fragment shader breaks the render using opengl GLES20 on Android

我正在尝试在 android 上渲染 3d 网格,顶点的位置是这样提供的:

        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);
            }

此代码在一台设备上运行良好(Android 9 在 OnePlus 设备上)但它不适用于(Android 10 Samsung Galaxy 设备)并且没有抛出任何错误。

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

您的代码无效 the spec:

The fragment language has no default precision qualifier for floating point types. Hence for float, floating point vector and matrix variable declarations, either the declaration must include a precision qualifier or the default float precision must have been previously declared.

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