首页 > 其他分享 >Qml-ShaderEffect的使用

Qml-ShaderEffect的使用

时间:2024-11-01 22:46:02浏览次数:3  
标签:layout qt vec4 ShaderEffect Qml 使用 着色器 location

Qml-ShaderEffect的使用

ShaderEffect的概述

  1. ShaderEffect使用自定义的顶点和片段着色器用于渲染一个矩形。用于在qml场景中添加阴影、模糊、着色和页面卷曲等效果。

  2. Qt5和Qt6中ShaderEffect有一定区别,在Qt6中由于支持不同的渲染API,ShaderEffect是用统一的qsb文件来满足对不同的渲染API支持。使用Qt6提供的qsb.exe工具来将顶点着色器和片段着色器生成qsb文件。

  3. 在Shader的编写中,顶点着色器默认输入有两个顶点:
    vec4 qt_Vertex 在location = 0,顶点坐标;
    vec2 qt_MultiTexCoord0 在 location = 1;纹理坐标。
    两个uniform变量:
    mat4 qt_Matrix:组合变换矩阵,从根项到该ShaderEffect的矩阵的乘积,以及正交投影.
    float qt_Opacity:组合不透明度,从根项到此ShaderEffect的不透明度的乘积
    注意 unoform变量的名字不能改变;ubo的布局是std140布局格式;具体可查阅openGL的全局缓冲对象(uniform buffer object)相关使用

  4. 在ShaderEffect 中声明的属性可以映射到Shader中,qml中类和Shader中类型映射关系如下:
    bool, int, qreal -> bool, int, float
    QColor -> vec4
    QPoint, QPointF, QSize, QSizeF -> vec2
    QVector3D -> vec3
    QVector4D -> vec4
    QTransform -> mat3
    QMatrix4x4 -> mat4
    QQuaternion -> vec4
    Image -> sampler2D
    ShaderEffectSource-> sampler2D

  5. 注意本实例代码在Qt6.5版本中测试验证的。Qt6和Qt5有差异

ShaderEffect的实例代码

1.qml代码如下

import QtQuick

Rectangle {
    width: 240;
    height: 100
    Row {
        spacing: 20
        Image {
            id: img;
            sourceSize { width: 100; height: 100 }
            source: "qrc:/qt/qml/text/qmlDemo/Resource/qtlogo.png"                     //图片路径,根据需要可做调整
        }
        ShaderEffect {
            width: 100; height: 100
            property variant src: img                                               //定义一个属性,属性名 src,值为Image,映射到Shader中是sampler2D;
            vertexShader: "qrc:/qt/qml/text/qmlDemo/myeffect.vert.qsb"
            fragmentShader: "qrc:/qt/qml/text/qmlDemo/myeffect.frag.qsb"
        }
    }
}
  1. 顶点着色器代码如下:
#version 440
//location 顶点位置
layout(location = 0) in vec4 qt_Vertex;
layout(location = 1) in vec2 qt_MultiTexCoord0;
layout(location = 0) out vec2 coord;
//std140 使用std140内存布局,std140有一套对齐规则 binding = 0 将ubo 绑定到绑定点0
layout(std140, binding = 0) uniform buf {
    mat4 qt_Matrix;
    float qt_Opacity;
};
void main() {
    coord = qt_MultiTexCoord0;
    //gl_Position 是glsl 顶点着色器中内置变量
    gl_Position = qt_Matrix * qt_Vertex;
}
  1. 片段着色器代码如下:
#version 440
//片段着色器
layout(location = 0) in vec2 coord;
layout(location = 0) out vec4 fragColor;
layout(std140, binding = 0) uniform buf {
    mat4 qt_Matrix;
    float qt_Opacity;
};
//src 是 qml中ShaderEffect 中映射进来Image对象,当作纹理
layout(binding = 1) uniform sampler2D src;
void main() {
   
    vec4 tex = texture(src, coord);			//对纹理采样
    //dot 是点剩,即对采样出来的r*0.344 g*0.5 b*0.146;灰度化。
    fragColor = vec4(vec3(dot(tex.rgb, vec3(0.344, 0.5, 0.156))), tex.a) * qt_Opacity;
}

4.qsb命令:
–glsl: OpenGL和OpenGLES --hlsl: DX11 -o :输出文件名

	qsb --glsl "100 es,120,150" --hlsl 50 --msl 12 -o myeffect.frag.qsb myeffect.frag

ShaderEffect实例代码运行结果如下:

1.个人理解:ShaderEffect是用户自己写Shader对渲染进行控制,可用于一些特效处理或者后期处理。
2.ShaderEffect可以和layer.effect结合做一些特殊处理。
3.在ShaderEffect中,还可以使用单个Shader,比如只编写片段着色器,对片段进行特殊处理。
4.ShaderEffect中涉及到很多OpenGL相关的知识和概念,可以通过学习 learnOpengl 去了解更多OpenGL相关的知识和概率。
5.在Qt帮助文档中,有用ShaderEffect 类处理渐变文本实例,感兴趣小伙伴可以多研究下原理。
在这里插入图片描述

标签:layout,qt,vec4,ShaderEffect,Qml,使用,着色器,location
From: https://blog.csdn.net/u013125105/article/details/143349342

相关文章

  • VMAF视频质量评估使用方法
    VMAF(VideoMultimethodAssessmentFusion)是一种基于机器学习的视频质量评估方法,它通过分析视频序列的多个质量特征来预测观众的主观质量感受。VMAF得分范围从0到100,其中100表示最高质量。以下是VMAF的使用方法和相关信息:VMAF使用方法FFmpeg集成:VMAF已被集成到FFmpeg中,作为一个......
  • lock 锁的使用场景
    publicclassProductService:IProductService{privatereadonlyobject_locker=newobject();privatereadonlyIMemoryCache_memoryCache;publicProductService(IMemoryCachememoryCache){_memoryCache=memoryCache;......
  • 如何使用GitHub上传文件
    使用GitHub上传文件的方法:1.创建GitHub仓库;2.使用GitHubDesktop上传文件;3.使用命令行上传文件;4.检查GitHub仓库。在开始之前,您需要一个GitHub账号。如果还没有账号,您可以在GitHub官方网站上注册一个。1.创建GitHub仓库在开始之前,您需要一个GitHub账号。如果还没有账号,您可以......
  • 三周精通FastAPI:27 使用使用SQLModel操作SQL (关系型) 数据库
    官网文档:https://fastapi.tiangolo.com/zh/tutorial/sql-databases/SQL(关系型)数据库¶FastAPI不需要你使用SQL(关系型)数据库。但是您可以使用任何您想要的关系型数据库。这里我们将看到一个使用SQLModel的示例。SQLModel是在SQLAlchemy和Pydantic的基础上构建的。它......
  • 使用批处理,切换电源计划,切换自动休眠时间
    1、打开命令提示符:按Win+R,输入cmd,然后按Enter。2、列出电源计划的GUIDpowercfg/list获取输出结果取下:C:\Users\Administrator>powercfg/list现有电源使用方案(*Active)-----------------------------------电源方案GUID:381b4222-f694-41f0-****-ff5bb260df......
  • 使用 AutoTrain 进行图像分类
    使用AutoTrain进行图像分类https://huggingface.co/blog/autotrain-image-classification2022年9月28日发布GitHub上的更新尼玛·博斯卡里诺尼玛·博斯卡里诺所以,您已经听说了机器学习领域正在发生的所有酷事,并且想要加入其中。只有一个......
  • JWT在SpringBoot项目中的使用方法与优劣性
    JWT介绍JWT(JSONWebToken)是一种用于在网络应用环境中安全地传递信息的开放标准(RFC7519)。它是一种基于JSON的令牌格式,广泛用于身份验证和信息交换。JWT的结构JWT通常由三部分组成:头部(Header)、有效载荷(Payload)和签名(Signature)。这三部分通过.字符连接在一起,形成一......
  • C语言中的数组初始化和使用技巧
    在编程语言C中,数组初始化和有效使用是至关重要的。数组是一种存储固定大小顺序集合的变量,通常用于存储相同类型的元素。数组的初始化涉及为数组元素赋予初始值、辨识数组边界,以及选择合适的数组类型等。例如,初始化一个整型数组可以使用intarr[10]={0};这会创建一个有10个整......
  • PHP使用RabbitMQ
    文档官网:https://www.rabbitmq.com/tutorials/tutorial-one-phpRabbitMQ关系说明:交换机:一个交换机可以有多个路由(routeKey),一个路由(routeKey)可以绑定多个队列。在发布消息的时候指定交换机对应的路由(routeKey),即可对应到该路由(routeKey)对应的队列。队列:常驻内存监听进......
  • 电路板和芯片的使用有什么区别
    电路板和芯片在电子设备中扮演着关键角色,它们是现代电子技术不可或缺的组成部分。尽管二者在电子系统中常常共同工作,但它们的功能、设计原理、应用场景和技术要求有着本质的区别。本文旨在探讨电路板和芯片在使用上的主要区别,包括:1.基本功能和构造差异;2.设计和制造过程;3.应用领域......