QOpenGLShader 无法在 Android 上编译 GLSL 120
QOpenGLShader Can't Compile GLSL 120 On Android
我已经在 Qt5 上为 Mac OS 10.10 编写了 OpenGL 代码。 GLSL版本是120到运行没有问题。
#version 120
attribute highp vec4 vVertex;
attribute vec3 vNormal;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat4 normalMatrix;
uniform vec3 vLightPosition;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
void main(void)
{
vVaryingNormal = mat3(normalMatrix) * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition-vPosition3);
gl_Position = mvpMatrix * vVertex;
}
当我尝试将代码移动到 Andriod 的编译和 运行 时,我收到了 flowwing 错误:
W/Qt (21457): (null):0 ((null)): QOpenGLShader::compile(Vertex): 0:1:
P0007: Language version '120' unknown, this compiler only supports up to
version '300 es'
为什么 QOpenGLShader for Andriod 不支持 glsl 120?如何解决问题?
Android 使用 OpenGL ES,OpenGL ES 和完整 OpenGL 之间的 GLSL 版本不同。
OpenGL ES 的有效版本是:
version 100
: ES 2.0.
version 300 es
: ES 3.0.
version 310 es
: ES 3.1.
完整 OpenGL 的有效版本是:
version 110
: OpenGL 2.0.
version 120
: OpenGL 2.1.
version 130
: OpenGL 3.0.
version 140
: OpenGL 3.1.
version 150
: OpenGL 3.2.
version 330
: OpenGL 3.3.
version 400
: OpenGL 4.0.
version 410
: OpenGL 4.1.
version 420
: OpenGL 4.2.
version 430
: OpenGL 4.3.
version 440
: OpenGL 4.4.
version 450
: OpenGL 4.5.
从 OpenGL 3.2 (version 150
) 开始,可以指定一个可选的配置文件。 3.3 的有效版本字符串例如:
#version 330
#version 330 core
#version 330 compatibility
在您的情况下,您可能希望使用支持所需功能集的最低 ES 版本。如果 ES 2.0 足够,你可以使用:
#version 100
如果你需要 ES 3.0:
#version 300 es
您也可以使用预定义的GL_ES
预处理器符号使版本有条件,并为OpenGL ES和OpenGL使用相同的着色器代码:
#if GL_ES
#version 300 es
#else
#version 120
#endif
我已经在 Qt5 上为 Mac OS 10.10 编写了 OpenGL 代码。 GLSL版本是120到运行没有问题。
#version 120
attribute highp vec4 vVertex;
attribute vec3 vNormal;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat4 normalMatrix;
uniform vec3 vLightPosition;
varying vec3 vVaryingNormal;
varying vec3 vVaryingLightDir;
void main(void)
{
vVaryingNormal = mat3(normalMatrix) * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition-vPosition3);
gl_Position = mvpMatrix * vVertex;
}
当我尝试将代码移动到 Andriod 的编译和 运行 时,我收到了 flowwing 错误:
W/Qt (21457): (null):0 ((null)): QOpenGLShader::compile(Vertex): 0:1:
P0007: Language version '120' unknown, this compiler only supports up to
version '300 es'
为什么 QOpenGLShader for Andriod 不支持 glsl 120?如何解决问题?
Android 使用 OpenGL ES,OpenGL ES 和完整 OpenGL 之间的 GLSL 版本不同。
OpenGL ES 的有效版本是:
version 100
: ES 2.0.version 300 es
: ES 3.0.version 310 es
: ES 3.1.
完整 OpenGL 的有效版本是:
version 110
: OpenGL 2.0.version 120
: OpenGL 2.1.version 130
: OpenGL 3.0.version 140
: OpenGL 3.1.version 150
: OpenGL 3.2.version 330
: OpenGL 3.3.version 400
: OpenGL 4.0.version 410
: OpenGL 4.1.version 420
: OpenGL 4.2.version 430
: OpenGL 4.3.version 440
: OpenGL 4.4.version 450
: OpenGL 4.5.
从 OpenGL 3.2 (version 150
) 开始,可以指定一个可选的配置文件。 3.3 的有效版本字符串例如:
#version 330
#version 330 core
#version 330 compatibility
在您的情况下,您可能希望使用支持所需功能集的最低 ES 版本。如果 ES 2.0 足够,你可以使用:
#version 100
如果你需要 ES 3.0:
#version 300 es
您也可以使用预定义的GL_ES
预处理器符号使版本有条件,并为OpenGL ES和OpenGL使用相同的着色器代码:
#if GL_ES
#version 300 es
#else
#version 120
#endif