公司新闻MSC行业新闻Qt行业新闻行业新闻QtSquishCocoTest CenterAxivionQt系列产品MSC AdamsMSC NastranMSC MarcMSC ApexSimufact.WeldingCAE FatigueRomaxCradle CFDMSC系列产品SimericsProcastVA ONESYSWELD国外工业软件国产动力学分析软件(DAP)螺栓连接安全评估软件国产复合材料热压罐成型工艺优化软件国产疲劳分析软件试验数据快速处理分析系统软件国产结构(微纳尺度)分析软件国产工业软件超高周疲劳材料、构件测试产品检测可靠性测试设备特种光纤器具硬件产品(MCT)行业解决方案学科解决方案技术方案MSC系列产品培训Qt系列产品培训技术培训MSC系列资源下载中心Qt系列资源下载中心Simerics资源下载中心文档下载
我们致力于推动科技创新,以先进的技术和优质的服务为企业创造更大的价值
办公室电话:
028-80269112
欢迎您访问南通玛尔斯科仿真科技有限公司!

知识 | OpenGL Shading Language入门

发表时间:2022-09-20 16:21

我是在使用 Qt 5.15 为客户开发 QtQuick3D 场景时接触的GLSL,通过以下网站快速入门
https://doc.qt.io/qt-5/custom-material-reference.html
https://github.com/wshxbqq/GLSL-Card
https://thebookofshaders.com/?lan=ch
https://openglbook.com/chapter-0-preface-what-is-opengl.html
https://learnopengl-cn.github.io/
https://www.khronos.org/registry/OpenGL-Refpages/es3/
https://docs.gl/el3/gl_Position



---------------------------------------------------


在给 Model 设置自定义材质时,可以编写 Shader
推荐使用 Qt Design Studio(以下简称 QDS) 来开发 3D 场景,下载链接(版本2.3.1)
这里我创建了一个简单的 3D demo



图片













//example.vert顶点着色器invec3 attr_pos;uniformmat4 modelViewProjection;
outvec3 pos;
voidmain() {pos = attr_pos;pos.x+= sin(time * 4.0 + pos.y) * amplitude;gl_Position = modelViewProjection * vec4(pos, 1.0);}








//example.frag 片段着色器out vec4 fragColor;
in vec3 pos;
voidmain() {    fragColor = vec4(pos.x * 0.02, pos.y * 0.02, pos.z * 0.02, 1.0);}


QDS 是基于原先的 Qt Creator 代码框架构建的,用法不必赘述
点开帮助文档页面,输入 custom material reference,可以找到着色器内置的一些变量


图片


常用的也就 attr_pos attr_uv0modelViewProjection



---------------------------------------------------


接下来,我们尝试自己编写一个自定义的 Material
首先,我们创建一个最简单的 View3D
打开 QDS,载入 ADAS.qmlproject
运行后,是一个绿色的矩形框



选择 main.qml,切换到设计模式,可以在 3D 视角预览场景


图片


整个场景由一个 Camera 和 一个 Model 组成
Model 的 source 是 Qt 内置的 Plane,我们可以在 Components 标签下找到


图片


只要拖动这个 Plane 到 3D 场景场景中,就可以创建一个矩形,代码会自动生成



























importQtQuick 2.15importQtQuick3D 1.15
View3D{width: 800height: 600
PerspectiveCamera{id: cameraz: 50fieldOfView: 100
Model{id: rectz: -50source: "#Rectangle"DefaultMaterial{id: rectMaterialdiffuseColor: "#4aee45"lighting: DefaultMaterial.NoLighting}materials: rectMaterial}}}


我们定义了一个 DefaultMaterialdiffuseColor 代表它的颜色,lighting 设置为 NoLighting 代表不计算光照(因为我们没有设置灯光,而默认值是 FragmentLighting,没有设置灯光的话,会显示成黑色),不计算光照的话就会显示 diffuseColor
接下来,我们用 Shader 来改变这个矩形的颜色,这里用到了 CustomMaterial 需要 import QtQuick3D.Materials







































importQtQuick 2.15importQtQuick3D 1.15importQtQuick3D.Materials 1.15
View3D{width: 800height: 600
PerspectiveCamera{id: cameraz: 50fieldOfView: 100
Model{id: rectz: -50source: "#Rectangle"materials: rectMaterial
CustomMaterial{id: rectMaterialshaderInfo: ShaderInfo {version: "330"type: "GLSL"}passes: [Pass{shaders: Shader {stage: Shader.Fragmentshader: "simple.frag"}}]}}}}


这是一个最简单的片段着色器代码,fragColor 代表返回的颜色,这里是红色









//simple.fragout vec4 fragColor;
voidmain(){    fragColor = vec4(1.0, 0.0, 0.0, 1.0);}


图片


既然我们已经学会了基本的 shader,那么参考 shadertoy 网站 我们就可以做出丰富多彩的 3D 模型


图片


本文中所有演示代码可点击这里下载(提取码:4i62 )。




分享到: