OpenGL/Android 仅限 GLSL ES 3.00

OpenGL/Android GLSL ES 3.00 only

我的目标是在我的 Android 应用程序中使用 OpenGL 3.1 来显示纹理。 目前的问题是,着色器无法编译。

private final String vertexShaderCode =
        // This matrix member variable provides a hook to manipulate
        // the coordinates of the objects that use this vertex shader
                "uniform mat4 uMVPMatrix;" +
                "in vec4 vPosition;" +
                "in vec2 vTextureCoordinate;" +
                "out vec2 exTextureCoordinate;" +
                "void main() {" +
                // the matrix must be included as a modifier of gl_Position
                // Note that the uMVPMatrix factor *must be first* in order
                // for the matrix multiplication product to be correct.
                "  gl_Position = uMVPMatrix * vPosition;" +
                "   exTextureCoordinate = vTextureCoordinate;" +
                "}";

private final String fragmentShaderCode =
                "precision mediump float;" +
                "uniform sampler2D texture;" +
                "in vec2 exTextureCoordinate;" +
                "out vec4 out_Color;" +
                "void main() {" +
                "  out_Color = texture2D(texture, exTextureCoordinate);" +
                "}";

想法:将模型-视图矩阵连同 space 中的位置和纹理坐标一起传递给顶点着色器。纹理坐标传递给 fragmentShader 进行着色,space 坐标通过模型-视图矩阵进行变换。

我在编译着色器时收到以下错误代码:

E/ShaderCompile: Error compiling shader!
E/ShaderCompile: 
ERROR: 0:1: 'in' : storage qualifier supported in GLSL ES 3.00 only  
ERROR: 0:1: 'in' : storage qualifier supported in GLSL ES 3.00 only  
ERROR: 0:1: 'out' : storage qualifier supported in GLSL ES 3.00 only  
E/ShaderCompile: Error compiling shader!
E/ShaderCompile: 
ERROR: 0:1: 'in' : storage qualifier supported in GLSL ES 3.00 only  
ERROR: 0:1: 'out' : storage qualifier supported in GLSL ES 3.00 only  

我使用以下代码设置 OpenGLES 版本:

uses-feature android:glEsVersion="0x00030001" android:required="true"
setEGLContextClientVersion(3);

您没有定义要使用的 GLSL 版本,这意味着它会回退到较早的版本(不是 3)。您可以将 GLSL ES 1 与 GLES 3 一起使用,因此它不会默认为当前的 GLES 版本。

因此,在着色器文件的顶部(第一行)声明版本:

# version 300 es

片段和顶点着色器都必须这样做


请注意,这实际上需要设备支持 GLES 和 GLSL 3。如果您使用默认的 Android 模拟器(与 SDK 一起打包的模拟器),您将无法测试 GLES/GLSLES 3,因为不支持。使用真实设备(当然支持 GLES3)或支持 GLES3 的模拟器

从 Android Studio 3.6 开始,API 29,GLES 3 和 GLSL 模拟器支持 3,使用 SwiftShader 或桌面原生 OpenGL。 您需要指定 Zoe 上面写的版本:

# version 300 es