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
我的目标是在我的 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