Linux下实现QT OpenGL的3D展示(各类问题及解决)

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);
}

至此,可在Linux CentOS下实现模型3D展示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QtOpenGLQt的一个模块,它提供了在Qt应用程序中进行3D图形渲染的功能。在QtOpenGL中,可以使用OpenGL的API来创建和操作3D图形,包括模型的导入、矩阵变换和简单的视角变换等等。 QtOpenGL提供了一系列的类和函数,用于实现3D游戏开发框架。其中,可以使用QGLWidget类来创建一个OpenGL窗口,用于显示3D场景。可以通过重写QGLWidget的paintGL函数来实现对场景的绘制。可以使用QGLFunctions类来访问OpenGL的函数,进行各种图形操作。可以使用QGLBuffer类来管理顶点数据和纹理数据。可以使用QGLShaderProgram类来管理着色器,实现光照效果等。可以使用QMatrix4x4类来进行矩阵变换,实现模型的旋转、平移和缩放等。可以使用QVector3D类来表示三维坐标,进行向量计算等。 除了QtOpenGL,还有其他一些开源的3D游戏开发框架可以使用,如Unity、Unreal Engine和CryEngine等。这些框架提供了更高级的功能和更丰富的资源,适用于开发更复杂的3D游戏。但是,如果你熟悉Qt并且想要在Qt应用程序中集成一些简单的3D图形,那么QtOpenGL是一个不错的选择。<span class="em">1</span> #### 引用[.reference_title] - *1* [qt OpenGL 3d游戏开发框架](https://download.csdn.net/download/kangkanglhb88008/11156007)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值