QOpenGLShader无法在Android上编译GLSL 120

时间:2015-04-27 05:57:20

标签: qt opengl-es-2.0 shader

我在Qt5 for 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'

为什么Andriod的QOpenGLShader不支持glsl 120?如何解决问题?

1 个答案:

答案 0 :(得分:3)

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