QT OpenGL代码移植到Linux 下遇到的各类问题:
软件下载地址:QT5.9.9
CentOS安装这里不赘述了,网上有很多。
CentOS与Windows共享文件夹如何设置
我找到的可用教程
简单来说就是:
虚拟机-设置-选项-共享文件夹总是启用-添加主机文件夹-启用完成确定
之后进入CentOS,进入mnt文件夹
创建共享文件夹:mkdir share
挂载:mount -t fuse.vmhgfs-fuse .host:/ /mnt/share/ -o allow_other
永久挂载设置:vi /etc/fstab
按i进入编辑模式
.host:/ /mnt/share fuse.vmhgfs-fuse allow_other 0 0
编辑完成,ESC+:wq!保存并退出即可
QT5.9.9安装
可在Windows下下载好安装包,放进共享文件夹内,在虚拟机中打开。
安装教程和环境配置在此
但是我按此教程安装后不能用,可能原因是因为CentOS是我新安装的,没有gcc编译器,所以按此教程安装之后,
**执行:**yum install gcc-c++
安装成功后我的QT5.9.9就可以用了
我还遇到过一个问题就是:报错Cannot mix incompatible Qt library (version ) with this library
产生原因可能是你的虚拟机里有过多个版本QT,现在想用QT5.9,但是环境配置的是别的版本的。
解决方法是:使用qtcreator同目录下的qtcreator.sh启动
./qtcreator.sh
移植程序执行出错。
我在Linux和Windows下安装的相同版本的QT,程序也是完全一样的复制过去,但是运行不成功。
报错:error: GLSL 3.30 is not supported. Supported versions are: 1.10, 1.20, 1.30, 1.00 ES, and 3.00 ES
查阅各个博主分享原因,主要可能是VMware的版本跟不上,说是至少得是12,可我的版本就是12的,但是我的还是不行。还有一些别的方法大家可用搜索尝试一下,我这里分享一个我自己这里有效的方法。
由于出错的是#version 330版本的着色器代码,这可能是由于glsl版本不对造成的问题。我这里在linux下把着色器从desktop版改成es版就可以运行成功了。
借鉴网址:
虚拟机中使用OpenGL遇到的错误总结
QT的glsl文件新建时我们发现有俩种类型:es版和desktop版
GLSL3.3的代码转成GLSL1.x,2.x
es只支持三角形面的片元,故在加载3d模型时要把模型转成三角形片元的,而桌面版支持三角形,四边形及其他片元;
desktop版往es版更改规则如下:
很典型的Desktop版本的着色器代码。如果想将其转化成es2.0形式,需要区别glsl3.30和glsl1.x的区别,因为opengl 3.3和opengl es2.0不是一个时期的标准,这两个时期glsl(着色器编程语言)的语法是不一样的,opengl3.3和opengl es3.0才是同一个时期的东西。具体语法区别如下:
1.glsl3.30版本中的in/out对应glsl1.x中的attribute/varying
2.layout (location = x)可以删除,不指定具体位置
3.从顶点着色器传到片段着色器中的变量,前缀的in/out都要换成varying
4.片段着色器输出的值(FragColor)要改为gl_FragColor
5.将float类型的数值后的.f去掉,保留数字即可
如此更改完成后,一般的简单OpenGL显示图形等就可以了。
但是我的代码在顶点着色器vert中有矩阵的变化,其中有一行代码报错
mat3(model)报错,在Desktop版下这句代码意思是取四阶矩阵model的左上三阶。但是这段代码似乎在es版下不能使用。于是我将这段代码改成了个循环来获取左上三阶。
mat3 model_3;
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
model_3[i][j]=model[i][j];
}
}
代码
代码与Windows下的区别就在于着色器不同,这里就给出着色器的代码。其他代码可看前一节;
顶点着色器:
attribute vec3 aPos;
attribute vec3 aNormal;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;
varying vec3 FragPos;
varying vec3 Normal;
void main()
{
mat3 model_3;
for(int i=0;i<=2;i++){
for(int j=0;j<=2;j++){
model_3[i][j]=model[i][j];
}
}
gl_Position = projection * view * model * vec4(aPos, 1.0);
Normal = model_3 * aNormal;//用于旋转时,使得法向量一起改变
FragPos = vec3(model * vec4(aPos, 1.0));
}
片段着色器:
uniform vec3 objectColor;
uniform vec3 lightColor;
varying vec3 FragPos;
varying vec3 Normal;
uniform vec3 lightPos;
void main()
{
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
vec3 norm = normalize(Normal);
vec3 lightDir = normalize(lightPos - FragPos);
float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor;
vec3 result = (ambient + diffuse) * objectColor;
// vec3 result = 0.3 * objectColor;
gl_FragColor = vec4(result, 1.0);
}