当前位置: 首页 > news >正文

QML/QtQuick3D如何将数据传递给GLSL着色器?

QML 传递给 GLSL Shader中Uniform变量的工作原理详解

QML/QtQuick3D如何将数据传递给GLSL着色器?

例如

// 在Shader代码中直接使用 pos.x += (c0 + c1 * pos.z + c2 * pos.z * pos.z + c3 * pos.z * pos.z * pos.z);

c0,c1,c2,c3在着色器中没有声明但是又可以直接使用,为什么?

一般使用这类变量需要在GLSL中定义Uniform变量

// 标准GLSL写法 uniform float c0; uniform float c1; uniform float c2; uniform float c3; void main() { pos.x += (c0 + c1 * pos.z + c2 * pos.z * pos.z + c3 * pos.z * pos.z * pos.z); }

Uniform特点

  • 全局常量:整个渲染过程中值不变
  • CPU设置:由应用程序传递到GPU
  • 所有顶点共享:每个顶点看到的值相同

但是在qml中可以省略这个声明,是因为QtQuick3D的自动Uniform注入机制

// TrackMaterial.qmlCustomMaterial{id:idMaterial property real c0:0.0// QML属性property real c1:0.0property real c2:0.0property real c3:0.0property vector3d p0:Qt.vector3d(0,0,0)property color trackColor:"#00FF00"property int type:1vertexShader:"shaders/track.vert"}

自动生成:

// 自动插入到着色器前面uniform float c0;// 对应 property real c0uniform float c1;// 对应 property real c1uniform float c2;// 对应 property real c2uniform float c3;// 对应 property real c3uniform vec3 p0;// 对应 property vector3d p0uniform vec4 trackColor;// 对应 property color trackColoruniform int type;// 对应 property int type// 然后才是着色器代码 in vec3 attr_pos; ... void main() { // 现在可以直接使用 c0, c1,c2,c3, p0, trackColor, type }

QtQuick3D会自动

  1. 扫描QML中的property

  2. 生成对应的uniform声明

  3. 将值传递到着色器

以下是对应表单

QML类型GLSL类型示例
real/doublefloatproperty real c0: 0.0uniform float c0;
intintproperty int type: 1uniform int type;
vector2dvec2property vector2d pos: Qt.vector2d(0,0)uniform vec2 pos;
vector3dvec3property vector3d p0: Qt.vector3d(0,0,0)uniform vec3 p0;
vector4dvec4property vector4d data: Qt.vector4d(...)uniform vec4 data;
colorvec4property color clr: "#FF0000"uniform vec4 clr;
matrix4x4mat4property matrix4x4 matuniform mat4 mat;
http://www.cnnetsun.cn/news/88100.html

相关文章:

  • 用Deepseek-v3.1在Trae中编写AI中继程序
  • LobeChat能否实现思维导图输出?结构化内容展示尝试
  • 开源5G基站硬件参数
  • C#开发桌面应用调用GPT-SoVITS REST API实战
  • Dify Docker部署与使用全指南
  • 数组作为参数
  • 蜜罐技术-德迅猎鹰
  • Daily Report — Day 9 (Beta)
  • Seed-Coder-8B-Base与SonarQube智能集成路径
  • 基于CentOS7 DM8单机部署配置记录-20251216
  • 大模型入门:预训练、微调和蒸馏,一篇文章全掌握
  • LobeChat能否编写教案?教师备课自动化尝试
  • vLLM-Omni:全模态AI推理框架技术解析
  • 18、基于位置点的恢复
  • LobeChat文件上传与语音交互实测:这些功能太惊艳了
  • LobeChat日志记录与审计功能配置方法说明
  • Qwen3-8B接入MCP实现动态工具调用
  • Docker 从入门到精通教程
  • waitGroup底层源码分析
  • LobeChat能否用于编写Prometheus告警规则?可观测性增强
  • 大模型学习全攻略:七阶段系统学习路线图,从基础到实战应用,非常详细收藏我这一篇就够了
  • 玄晶引擎AI数字员工更新深度测评:Sora2赋能+RPA运营,AI内容生产进入效率革命期
  • YOLOv5中使用torch加载自定义模型进行目标检测
  • LobeChat能否隐藏源码信息?增强系统隐蔽性
  • React 的桶算法详解
  • 深入理解Dify的依赖管理机制(Dependency Walker适用场景)
  • CordovaOpenHarmony车辆管理系统开发
  • YOLO训练中断恢复技巧:避免重复计算
  • 电气自动化专业相关认证解析
  • 手机内存告急?MAZANOKE 压缩照片不损画质,加载cpolar远程用更方便