Qt QML 2D shader
---------------------------------------------------
Qt quick 2d shader effect
---------------------------------------------------
概念
着色器和普通的图像处理程序不同,它只针对一个点做运算,它包括:
vertext shader: 顶点着色器,主要用于处理位置,要求输出当前点的新位置。
fragment shader(pixel shader):片段着色器(像素着色器),主要用于处理色彩。要求输出当前点的新色彩。
系统会自动处理循环,并行运算多个点,自动处理图像边界
主要有两类Shader程序: GLSL(OpenGL提供), HLSL(DirectX提供)
注:好像时 5.6 版本后才支持directx,所以事情复杂了。现在Qt3D的shader就复杂无比. GLSL(OpenGL Shader Language)
参数修饰词
uniform : 表示每次运算时参数值不变的
varying : 表示每次运算时参数值时变动的。如当前点的纹理坐标
lowp : 表示低精度
highp : 表示高精度
预定义参数
uniform mat4 qt_Matrix : 变形矩阵- combined transformation matrix, the product of the matrices from the root item to this ShaderEffect, and an orthogonal projection.
uniform float qt_Opacity : 透明度- combined opacity, the product of the opacities from the root item to this ShaderEffect.
attribute vec4 qt_Vertex : 当前计算点的坐标
attribute vec2 qt_MultiTexCoord0 : 纹理坐标(输入的图片/item等)
输入参数类型映射
在ShaderEffect中定义的参数会自动映射到Shader里面去
bool, int, qreal -> bool, int, float
QColor -> vec4 : 注意色彩输入shader时会先做半透明预处理,如Qt.rgba(0.2, 0.6, 1.0, 0.5) 会转化为 vec4(0.1, 0.3, 0.5, 0.5)
QRect, QRectF -> vec4(x, y, w, h)
QPoint, QPointF, QSize, QSizeF -> vec2(x, y)
QVector3D -> vec3(x, y, z)
QVector4D -> vec4(x, y, w, w)
QTransform -> mat3
QMatrix4x4 -> mat4
QQuaternion -> vec4, scalar value is w.
Image -> sampler2D
ShaderEffectSource -> sampler2D
输出
vertext shader: 顶点着色器,主要用于处理位置,要求输出gl_Position参数。
fragment shader(pixel shader):片段着色器(像素着色器),主要用于处理色彩。要求输出gl_FragColor参数。
常用方法
lowp vect4 text = texture2D(src, qt_TexCoord0); // 取纹理色彩
abs/min/max/....
示例
ShaderEffect {
width: 200
height: 200
mesh: GridMesh { resolution: Qt.size(20, 20) }
property var source: Image {
source: "qt-logo.png"
sourceSize { width: 200; height: 200 }
}
vertexShader: "
uniform highp mat4 qt_Matrix;
attribute highp vec4 qt_Vertex;
attribute highp vec2 qt_MultiTexCoord0;
varying highp vec2 qt_TexCoord0;
uniform highp float width;
void main() {
highp vec4 pos = qt_Vertex;
highp float d = .5 * smoothstep(0., 1., qt_MultiTexCoord0.y);
pos.x = width * mix(d, 1.0 - d, qt_MultiTexCoord0.x);
gl_Position = qt_Matrix * pos;
qt_TexCoord0 = qt_MultiTexCoord0;
}"
} HLSL(Direct3D)
blablabla,有很多不同,
示例
Image { id: img; sourceSize { width:; height: 100 } source: "qt-logo.png" }
ShaderEffect {
width:; height: 100
property variant src: img
fragmentShader: "qrc:/effect_ps.cso"
}
cbuffer ConstantBuffer : register(b0)
{
float4x4 qt_Matrix;
float qt_Opacity;
};
Texture2D src : register(t0);
SamplerState srcSampler : register(s0);
float4 ExamplePixelShader(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET
{
float4 tex = src.Sample(srcSampler, coord);
float3 col = dot(tex.rgb, float3(0.344, 0.5, 0.156));
return float4(col, tex.a) * qt_Opacity;
} 跨平台的Shader写法
方法1(根据 GraphicsInfo.shaderType 判断):
Image { id: img; sourceSize { width:; height: 100 } source: "qt-logo.png" }
ShaderEffect {
width:; height: 100
property variant src: img
property variant color: Qt.vector3d(0.344, 0.5, 0.156)
fragmentShader:
GraphicsInfo.shaderType === GraphicsInfo.GLSL ?
"varying highp vec2 coord;
uniform sampler2D src;
uniform lowp float qt_Opacity;
void main() {
lowp vec4 tex = texture2D(src, coord);
gl_FragColor = vec4(vec3(dot(tex.rgb, vec3(0.344, 0.5, 0.156))), tex.a) * qt_Opacity;
}"
: GraphicsInfo.shaderType === GraphicsInfo.HLSL ?
"cbuffer ConstantBuffer : register(b0)
{
float4x4 qt_Matrix;
float qt_Opacity;
};
Texture2D src : register(t0);
SamplerState srcSampler : register(s0);
float4 ExamplePixelShader(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET
{
float4 tex = src.Sample(srcSampler, coord);
float3 col = dot(tex.rgb, float3(0.344, 0.5, 0.156));
return float4(col, tex.a) * qt_Opacity;
}"
: ""
}
方法2(自动选择):
Image { id: img; sourceSize { width:; height: 100 } source: "qt-logo.png" }
ShaderEffect {
width:; height: 100
property variant src: img
property variant color: Qt.vector3d(0.344, 0.5, 0.156)
fragmentShader: "qrc:shaders/effect.frag" // 系统会自动选择 shaders/effect.frag 或 shaders/+hlsl/effect.frag
} 示例
// 去色
ShaderEffect {
fragmentShader: "
uniform lowp sampler2D source; // this item
uniform lowp float qt_Opacity; // inherited opacity of this item
varying highp vec2 qt_TexCoord0;
void main() {
lowp vec4 p = texture2D(source, qt_TexCoord0);
lowp float g = dot(p.xyz, vec3(0.344, 0.5, 0.156));
gl_FragColor = vec4(g, g, g, p.a) * qt_Opacity;
}"
} // 图层混合
ShaderEffect {
property var colorSource: gradientRect;
fragmentShader: "
uniform lowp sampler2D colorSource;
uniform lowp sampler2D maskSource;
uniform lowp float qt_Opacity;
varying highp vec2 qt_TexCoord0;
void main() {
gl_FragColor =
texture2D(colorSource, qt_TexCoord0)
* texture2D(maskSource, qt_TexCoord0).a
* qt_Opacity;
}
"
} // 上下两边虚化
Flickable{
....
}
ShaderEffectSource {
id: flickableAreaSource
sourceItem: flickableArea
hideSource: true
visible: false
}
ShaderEffect {
property variant src: flickableAreaSource
anchors.fill: flickableArea
fragmentShader: "
varying highp vec2 qt_TexCoord0;
uniform lowp float qt_Opacity;
uniform sampler2D src;
void main() {
lowp vec4 tex = texture2D(src, qt_TexCoord0);
lowp float dist = abs(qt_TexCoord0.y-0.5)*4.0;
tex*= min(1.0, (2.0 - dist));
gl_FragColor = tex * qt_Opacity;
}"
}
Qt QML 2D shader的更多相关文章
- Qt qml 单例模式
Qt qml 单例模式,没什么好说的,看代码吧.单例模式很适合做全局的配置文件. [示例下载] http://download.csdn.net/detail/surfsky/8539313 [以下是 ...
- Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)
Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果] [功能] 下拉刷新 ...
- qt qml qchart 图表组件
qt qml qchart 图表组件 * Author: Julien Wintz * Created: Thu Feb 13 23:41:59 2014 (+0100) 这玩意是从chart.js迁 ...
- qt qml中PropertyAnimation的几种使用方法
qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移 ...
- Qt QML referenceexamples attached Demo hacking
/********************************************************************************************* * Qt ...
- Qt qml的软件架构设计
google: qt qml application architecture 有很多资源. 1 https://www.ics.com/blog/multilayered-architecture- ...
- qt qml 刮刮卡效果
用canvas+mouseArea实现的刮刮卡效果. 表层是一层色彩,用手指划开,可看到下面的文字Lisence: MIT, 请保留本文档说明Author: surfsky.cnblogs.com 2 ...
- QT QML目录导航列表视图
[功能] /目录.文件 /文件过滤 /递归 /事件 /高亮当前行 /当前选项 /目录切换动画 /限制根目录 [下载]:http://download.csdn.net/detail/surfsky/8 ...
- Qt中2D绘图问题总结(一)----------基本的绘制与填充
刚刚开始学习Qt不久,才开始渐渐地熟悉基础内容,学习过程中的一些知识的总结和感悟希望通过博客记录下来,与大家分享学习的同时,也是对自己坚持下去的鞭策,废话不多说了,开始第一次的小总结吧. Qt提供了强 ...
随机推荐
- 根据两点经纬度计算距离和角度——java实现
原理:见上一篇博客 http://blog.csdn.net/xiaobai091220106/article/details/50879365 百度地图拾取经纬度坐标:http://api.ma ...
- C语言复习0_准备工作
前言: 第一次接触C语言是大一下学期的时候,2013年上半年,那个时候的开发工具还是VS C++,今天了解了一下,常用的开发工具变成了CodeBlocks.决定趁着毕业到入职这一段CD时间,拾起这门语 ...
- python +ps 三方面库整理
-------------------------------------------端口进程相关------------------------------------------------cp ...
- 白盒测试实践-day04
一.任务进展情况 通过小组成员的共同努力,终于完成了此次“白盒测试实践”任务.目前的主要任务将之前的文件汇总,整理出来. 二.存在的问题 由于测试系统的不完善,导致单元测试比较麻烦. 三.解决方法 认 ...
- tableview Footerview有多余的间距
调整footerView的高度 UIView *footerV = [[UIView alloc] initWithFrame:CGRectMake(, , Main_Screen_Width, )] ...
- 栈->栈与递归
文字简述 1.阶乘函数 2.2阶Fiibonacci数列 3.n阶Hanoi塔问题 代码实现 // // Created by lady on 19-4-3. // #include <stdi ...
- 《HTTP - 跨域》
本文参考 HTTP访问控制(CORS) 一:什么是跨域? - 所谓跨域, 是浏览器为了保护网站安全而建立的一种保护策略,既浏览器的同源策略. - 意味着使用这些API的Web应用程序只能从加载应用程序 ...
- AOP代理对象生成
AOP(Aspect-OrientedProgramming,面向方面编程)是OOP(Object-Oriented Programing,面向对象编程)的良好补充与完善,后者侧重于解决 从上到下的存 ...
- 多线程深入:synchronized(转,有删减)
原文:https://www.cnblogs.com/hapjin/p/4678773.html synchronized 修饰方法时锁定的是调用该方法的对象.它并不能使调用该方法的多个对象在执行顺序 ...
- git使用:本地项目推送到gitlab
背景:目前公司用gitlab管理我们的项目,经常遇到的问题是,我会在其他已有项目上直接进行修改,然后用于新项目的自动化测试,但是本地推送到gitlab的时候每次都要重新查询一遍怎么操作,特意写下这篇文 ...