一、问题情况描述
本人在GitHub下载了一个基于Qt的三维模型显示的例子程序,想移植到Qt for Android平台,但是在移植过程中出现了各种问题,并逐一解决了,在这里一一作以总结。该例子程序通过Desktop_Qt_5_14_0_MinGW_32_bit-Release编译没有问题,能顺利显示三维模型。模型界面如下:
片段着色器程序文件fshader.glsl如下:
#version 330 core
in vec3 normal;
in vec3 position;
layout(location=0) out vec4 fragColor;
uniform vec4 lightPosition;
uniform vec3 lightIntensity;
uniform vec3 Ka;
uniform vec3 Kd;
uniform vec3 Ks;
uniform float shininess;
void main()
{
vec3 n=normalize(normal);
vec3 s=normalize(lightPosition.xyz-position);
vec3 v=normalize(-position.xyz);
vec3 h=normalize(v+s);
float sdn=dot(s,n);
vec3 ambient=Ka;//环境光
vec3 diffuse=Kd*max(sdn,0.0);//漫反射
vec3 specular=Ks*mix(0.0,pow(dot(h,n),shininess),step(0.0,sdn));//镜面反射,高光
//fragColor=vec4(lightIntensity*(ambient+diffuse+specular),1);
fragColor=vec4(lightIntensity*(0.1*ambient+diffuse+specular),1);
}
顶点着色器程序文件vshader.glsl如下:
#version 330 core
layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec3 vertexNormal;
out vec3 normal;
out vec3 position;
uniform mat4 MV;
uniform mat3 N;
uniform mat4 MVP;
void main()
{
normal=normalize(N*vertexNormal);
position=vec3(MV*vec4(vertexPosition,1.0));
gl_Position=MVP*vec4(vertexPosition,1.0);
}
但是用Android for armeabi-v7a,arm64-v8a,x86,x86_x64(Clang Qt5.14.0 for Android)编译,,程序在手机上刚一运行就终止了,并产生如下编译运行信息:
错误信息:
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(MV): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(N): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(MVP): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Ka): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Kd): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Ks): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(shininess): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Ka): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Kd): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(Ks): shader program is not linked
W libDemo_armeabi-v7a.so: QOpenGLShaderProgram::uniformLocation(shininess): shader program is not linked
表明片段着色器程序和顶点着色器程序存在问题。
二、问题处理过程
通过分析上述的错误信息,发现片段着色器程序中文注释有乱码,删掉着色器程序文件中的中文注释,“W libDemo_armeabi-v7a.so: QOpenGLShader::compile(Vertex): FLEX: Unknown char ï” 表明顶点着色器文件有非法符号,说明shader文件的保存格式存在问题,打开发现两个文件都是UTF-8格式的,由于shader文件的保存格式是GB2312(ANSI),将着色器文件fshader.glsl和vshader.glsl用记事本打开另存为ANSI格式。继续编译,又出现一下错误信息:
“W libDemo_armeabi-v7a.so: QOpenGLShader::compile(Vertex): ERROR: Invalid #version”,说明着色器版本不对,用#version 330 core,#version 320 core都不行,删掉版本设置还是报错,错误信息:
"W libDemo_armeabi-v7a.so: QOpenGLShader::compile(Vertex): ERROR: 0:7: 'in' : Syntax error: syntax error"
说明着色器程序版本不对,程序仍然不能Link成功。将两个着色程序器版本修改为:#version 300 es,Invalid #version的错误没有了,说明Android手机支持#version 300 es版本的着色器程序,但是仍然有以下错误信息:
W libDemo_armeabi-v7a.so: QOpenGLShader::compile(Vertex): ERROR: 0:9: 'vertexPosition' : redefinition
W libDemo_armeabi-v7a.so: ERROR: 0:10: 'vertexNormal' : redefinition
原来在修改着色器程序中写成这样了:
layout(location=0) out vec4 fragColor;
out vec4 fragColor;
layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec3 vertexNormal;
in vec3 vertexPosition;
in vec3 vertexNormal;
删掉重复的程序:out vec4 fragColor; 和in vec3 vertexPosition;in vec3 vertexNormal;即可
最终片段着色器程序文件fshader.glsl如下:
#version 300 es
#ifdef GL_ES
precision mediump int;
precision mediump float;
#endif
in vec3 normal;
in vec3 position;
layout(location=0) out vec4 fragColor;
uniform vec4 lightPosition;
uniform vec3 lightIntensity;
uniform vec3 Ka;
uniform vec3 Kd;
uniform vec3 Ks;
uniform float shininess;
void main()
{
vec3 n=normalize(normal);
vec3 s=normalize(lightPosition.xyz-position);
vec3 v=normalize(-position.xyz);
vec3 h=normalize(v+s);
float sdn=dot(s,n);
vec3 ambient=Ka;
vec3 diffuse=Kd*max(sdn,0.0);
vec3 specular=Ks*mix(0.0,pow(dot(h,n),shininess),step(0.0,sdn));
fragColor=vec4(lightIntensity*(0.1*ambient+diffuse+specular),1);
}
最终片段着色器程序文件fshader.glsl如下:
#version 300 es
#ifdef GL_ES
precision mediump int;
precision mediump float;
#endif
layout(location=0) in vec3 vertexPosition;
layout(location=1) in vec3 vertexNormal;
out vec3 normal;
out vec3 position;
uniform mat4 MV;
uniform mat3 N;
uniform mat4 MVP;
void main()
{
normal=normalize(N*vertexNormal);
position=vec3(MV*vec4(vertexPosition,1.0));
gl_Position=MVP*vec4(vertexPosition,1.0);
}
编译后软件运行正常,编译运行信息如下:
I QtCore : Start
I Qt : qt started
I Adreno : QUALCOMM build : 89f10b9, I3d0e3ac366
I Adreno : Build Date : 12/25/18
I Adreno : OpenGL ES Shader Compiler Version: EV031.25.14.03
I Adreno : Local Branch :
I Adreno : Remote Branch :
I Adreno : Remote Branch :
I Adreno : Reconstruct Branch :
I Adreno : Build Config : S P 6.0.9 AArch32
I Adreno : PFP: 0x016ee177, ME: 0x00000000
I ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
I ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
I OpenGLRenderer: Initialized EGL, version 1.4
D OpenGLRenderer: Swap behavior 2
D libDemo_armeabi-v7a.so: m_program.log: ""
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.64, 0.64, 0.64)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.09, 0.224, 0.42)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.2, 0.2, 0.2)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.78, 0.569, 0.114)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.031, 0.376, 0.659)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(1, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.812, 0.765, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.867, 0.702, 0.345)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.753, 0.753, 0.753)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.988, 0.737, 0.518)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.796, 0.824, 0.937)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0, 0.667, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.847, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 92.1569
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.64, 0.64, 0.64)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 96.0784
D libDemo_armeabi-v7a.so: Size of materials 16
D libDemo_armeabi-v7a.so: Size of Meshes: 2989
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.84, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 94.1176
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.84, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 94.1176
D libDemo_armeabi-v7a.so: Ka QVector3D(1, 1, 1)
D libDemo_armeabi-v7a.so: Kd QVector3D(0.84, 0, 0)
D libDemo_armeabi-v7a.so: Ks QVector3D(0.5, 0.5, 0.5)
D libDemo_armeabi-v7a.so: Ns 94.1176
D libDemo_armeabi-v7a.so: Size of materials 3
D libDemo_armeabi-v7a.so: Size of Meshes: 9
I ct.example.Dem: ProcessProfilingInfo new_methods=160 is saved saved_to_disk=1 resolve_classes_delay=8000
手机端运行界面如下:
三、总结
1、着色器程序.glsl文件格式是GB2312(ANSI),在修改程序文件过程中,一定要注意将文件保存为GB2312(ANSI)格式;
2、Qt for Android 支持着色器程序版本为:#version 300 es