我是在使用 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);
}
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,可以找到着色器内置的一些变量

常用的也就 a
ttr_pos
、
attr_uv0
和
modelViewProjection
---------------------------------------------------
接下来,我们尝试自己编写一个自定义的 Material
首先,我们创建一个最简单的 View3D
打开 QDS,载入 ADAS.qmlproject
运行后,是一个绿色的矩形框
选择 main.qml,切换到设计模式,可以在 3D 视角预览场景

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

只要拖动这个 Plane 到 3D 场景场景中,就可以创建一个矩形,代码会自动生成
importQtQuick 2.15
importQtQuick3D 1.15
View3D{
width: 800
height: 600
PerspectiveCamera{
id: camera
z: 50
fieldOfView: 100
Model{
id: rect
z: -50
source: "#Rectangle"
DefaultMaterial{
id: rectMaterial
diffuseColor: "#4aee45"
lighting: DefaultMaterial.NoLighting
}
materials: rectMaterial
}
}
}
我们定义了一个 DefaultMaterial,diffuseColor 代表它的颜色,lighting 设置为 NoLighting 代表不计算光照(因为我们没有设置灯光,而默认值是 FragmentLighting,没有设置灯光的话,会显示成黑色),不计算光照的话就会显示 diffuseColor
接下来,我们用 Shader 来改变这个矩形的颜色,这里用到了 CustomMaterial 需要 import QtQuick3D.Materials
importQtQuick 2.15
importQtQuick3D 1.15
importQtQuick3D.Materials 1.15
View3D{
width: 800
height: 600
PerspectiveCamera{
id: camera
z: 50
fieldOfView: 100
Model{
id: rect
z: -50
source: "#Rectangle"
materials: rectMaterial
CustomMaterial{
id: rectMaterial
shaderInfo: ShaderInfo {
version: "330"
type: "GLSL"
}
passes: [
Pass{
shaders: Shader {
stage: Shader.Fragment
shader: "simple.frag"
}
}
]
}
}
}
}
这是一个最简单的片段着色器代码,fragColor 代表返回的颜色,这里是红色
out vec4 fragColor;
voidmain()
{
fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

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

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