11. ShaderEffect的简单使用

1. 说明:

shadereffect控件的使用需要结合glsl语言,对于glsl语言不太了解的可以先看看这篇文章:GLSL基本语法

2. 基本使用:

这个控件一般是用来对图像进行操作的,其中有两个经常用到的属性 fragmentShadervertexShader,前者的输出量一般是 gl_FragColor,控制着源文件的颜色值,后者的输出量一般为 gl_Position,控制着源文件的位置坐标。可以在这个控件当中使用 property 自定义属性,并在shader语法中使用 uniform 关键字定义变量,这样自定义属性就会自动传输到shader语法中进行使用。

2.1 举例一:

为图像添加一层阴影遮罩,代码如下:

Image {
    id: imageSource
    width: 80
    height: width
    source: "qrc:/images/xiaotu.jfif"
}
ShaderEffect{
    id:effect
    width: imageSource.width
    height: imageSource.height
    property variant source:imageSource	//自定义属性绑定到图像源
    //设置片段着色器
    //sampler2D 指定要访问的纹理(图片数据源相当于是纹理数据)
    //texture2D(sampler2D sampler,vec2 coord)使用纹理坐标coord在当前绑定到采样器sampler的2D纹理中进行纹理查找
    fragmentShader: "
        varying highp vec2 qt_TexCoord0;
        uniform sampler2D source;	//使用uniform修饰后,source变量会自动接受上面自定义属性中的source
        void main(){
            gl_FragColor = texture2D(source , qt_TexCoord0)* vec4(0.5, 0.5, 0.5, 1.0);//通过vec4(0.5, 0.5, 0.5, 1.0)增加阴影效果
        }"
}

效果如下:
在这里插入图片描述

2.2 举例二:

利用传参形式更改阴影效果

ShaderEffect{
    id:effect3
    width: imageSource.width
    height: imageSource.height
    property variant source:imageSource
    //指定绿色通道的值
    property real greenChannel: 1.0 //自己定义的参数
    //设置片段着色器
    //sampler2D 指定要访问的纹理(图片数据源相当于是纹理数据)
    //texture2D(sampler2D sampler,vec2 coord)使用纹理坐标coord在当前绑定到采样器sampler的2D纹理中进行纹理查找
    fragmentShader: "
        varying highp vec2 qt_TexCoord0;
        uniform sampler2D source;
        uniform lowp float greenChannel;    //用uniform关键字修饰,接收外界同名变量传参
        void main(){
            gl_FragColor = texture2D(source , qt_TexCoord0)* vec4(0.5, greenChannel, 0.5, 1.0);
        }"
}

效果如下:
在这里插入图片描述

2.3 举例三:

利用QML中的动画特性实时更改参数值,实现渲染变换

ShaderEffect{
    id:effect
    width: imageSource.width
    height: imageSource.height
    property variant source:imageSource
    //指定红色通道的值为0.3
    property real blueChannel: 0.3
    NumberAnimation on blueChannel {
        from: 0.0; to: 1.0; loops: Animation.Infinite; duration: 4000
    }
    //设置片段着色器
    //sampler2D 指定要访问的纹理(图片数据源相当于是纹理数据)
    //texture2D(sampler2D sampler,vec2 coord)使用纹理坐标coord在当前绑定到采样器sampler的2D纹理中进行纹理查找
    fragmentShader: "
        varying highp vec2 qt_TexCoord0;
        uniform sampler2D source;
        uniform lowp float blueChannel;
        void main(){
            gl_FragColor = texture2D(source , qt_TexCoord0)* vec4(0.5, 0.5, blueChannel, 1.0);
        }"
}

效果如下:

动画更改参数实现渲染

2.4 举例四:

利用顶点着色器实现动画效果

ShaderEffect{
   id:effect6
   width: imageSource.width
   height: imageSource.height
   property variant source:imageSource
   property bool minimized:false
   property real minimize:0.0

   MouseArea{
       anchors.fill: parent
       onClicked: {
           effect6.minimized = !effect6.minimized
       }
   }
   SequentialAnimation on minimize {
       id:startAnim
       running: effect6.minimized
       PauseAnimation{ duration: 300 }
       NumberAnimation{ to:1;duration: 700;easing.type: Easing.InOutSine }
       PauseAnimation{ duration: 1000 }
   }
   SequentialAnimation on minimize {
       id:endAnim
       running: !effect6.minimized
       NumberAnimation{ to:0;duration: 700;easing.type: Easing.InOutSine }
       PauseAnimation{ duration: 1300 }
   }
   vertexShader: "
		uniform highp mat4 qt_Matrix;
		attribute highp vec4 qt_Vertex;
		attribute highp vec2 qt_MultiTexCoord0;
		varying highp vec2 qt_TexCoord0;
		uniform highp float minimize;
		uniform highp float width;
		uniform highp float height;
		void main(){
    		qt_TexCoord0 = qt_MultiTexCoord0;
    		highp vec4 pos = qt_Vertex;
    		pos.y = mix(qt_Vertex.y,height,minimize);
    		pos.x = mix(qt_Vertex.x,width,minimize);
    		gl_Position = qt_Matrix * pos;
		}"
}

效果如下:

顶点着色器的动画

持续更新中,请大家多多关注…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山间点烟雨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值