基于QOpenGLWidget显示的三维模型移植在Qt for Android平台时“shader program is not linked”问题处理总结

一、问题情况描述

       本人在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

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值