news 2026/6/10 19:47:11

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:31:13

RocketMQ 网络性能调优:TCP 参数配置、连接池优化与延迟降低技巧

在高并发、低延迟的业务场景中,RocketMQ 的网络性能直接决定了消息传递的效率与稳定性。无论是峰值流量下的消息堆积,还是关键业务的延迟敏感需求,都需要从网络底层入手,通过 TCP 参数优化、连接池精细化配置以及针对性的延迟降低…

作者头像 李华
网站建设 2026/6/10 16:13:33

Facefusion输出视频不显示?检查路径中文问题

FaceFusion输出视频不显示?先查路径有没有中文 你有没有遇到过这种情况:FaceFusion 界面明明提示“处理完成”,进度条也走到底了,结果打开输出文件夹一看——空的。没有报错,没有崩溃,甚至连日志都风平浪静…

作者头像 李华
网站建设 2026/6/9 21:44:01

token处理

, (error) > {// 500 错误处理,并且包含token 说明token过期if (error.response?.status 500 && (error.response.data?.message?.includes(Token) || error.response.data?.message?.includes(token))) {let userStore useUserStore()userStore.…

作者头像 李华
网站建设 2026/6/9 23:30:44

selenium采集数据怎么应对反爬机制?

selenium是一个非常强大的浏览器自动化工具,通过操作浏览器来抓取动态网页内容,可以很好的处理JavaScript和AJAX加载的网页。 它能支持像点击按钮、悬停元素、填写表单等各种自动化操作,所以很适合自动化测试和数据采集。 selenium与各种主流…

作者头像 李华
网站建设 2026/6/9 17:27:58

Qwen3-VL-8B模型LoRA微调实战指南

Qwen3-VL-8B模型LoRA微调实战指南 你有没有遇到过这样的场景? 客服系统里,用户上传一张模糊的商品照,问:“这个能修吗?” 内容审核平台中,一张带文字的图片正在试探规则边界,需要判断是否违规…

作者头像 李华
网站建设 2026/6/10 16:13:08

如何将通义千问/百川/讯飞星火接入LobeChat?

如何将通义千问/百川/讯飞星火接入LobeChat? 在大模型技术快速普及的今天,越来越多企业希望为员工或客户打造专属的AI对话助手。但直接从零开发一个具备流畅交互、多模型支持和插件扩展能力的聊天界面,成本高、周期长。而开源项目如 LobeChat…

作者头像 李华