news 2026/7/16 15:43:46

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/7/16 4:54:11

用Deepseek-v3.1在Trae中编写AI中继程序

用 Deepseek-v3.1 在 Trae 中构建 AI 中继服务:打通国产大模型与 OpenAI 生态的桥梁 在本地开发中,我们常遇到这样一个问题:许多优秀的国产大模型(如百度飞桨星河社区部署的 ERNIE 系列)虽然性能强劲、中文理解出色&a…

作者头像 李华
网站建设 2026/7/15 7:17:35

LobeChat能否实现思维导图输出?结构化内容展示尝试

LobeChat能否实现思维导图输出?结构化内容展示尝试 在AI助手逐渐从“问答工具”演变为“认知协作者”的今天,用户不再满足于一串流水线式的文本回复。他们希望看到逻辑清晰的框架、层次分明的知识体系,甚至是可交互的图表——尤其是在处理复杂…

作者头像 李华
网站建设 2026/7/12 23:36:07

开源5G基站硬件参数

威武纪 高集成RFMC7000模块 SDR软件无线电 AD9371 FMC子卡和拓展卡pcie 300MHz~6GHz频段 SDR 开发评估发射接收卡 双通道收发链路 智邮开源 5G通信验证 射频板卡 OXG-SDR4100 软件无线电 SDR开发板 搭载两颗AD9371 开源5G基站OAI pcie 4路发射 4路接收 300MHz~6GHz …

作者头像 李华
网站建设 2026/7/13 4:02:48

C#开发桌面应用调用GPT-SoVITS REST API实战

C# 桌面应用集成 GPT-SoVITS 实现个性化语音合成实战 在当前 AI 技术快速落地的背景下,语音合成已不再是科研实验室里的“黑箱”技术。越来越多开发者希望将高质量的 TTS 能力嵌入到本地工具中——尤其是那些需要离线运行、保护隐私或具备图形化操作界面的应用场景。…

作者头像 李华
网站建设 2026/7/15 6:37:56

Dify Docker部署与使用全指南

Dify Docker部署与使用全指南 在生成式AI迅速渗透各行各业的今天,越来越多企业希望快速构建专属的智能应用——无论是自动回复客户咨询的客服机器人,还是能批量生成营销文案的内容引擎。但直接基于大模型从零开发,往往面临工程复杂、迭代缓慢…

作者头像 李华
网站建设 2026/7/15 20:20:08

数组作为参数

数组作为参数 当数组作为参数传递的时候&#xff0c;实际上传递的是数组的首地址&#xff0c;在语法上来说传递的是一个指针变量。 #include <stdio.h> #include <string.h>void getArrLen(char buffer[]) {printf_s("using sizeof: %zd\n", sizeof(buff…

作者头像 李华