| /**************************************************************************** |
| ** |
| ** Copyright (C) 2017 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the demonstration applications of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:BSD$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** BSD License Usage |
| ** Alternatively, you may use this file under the terms of the BSD license |
| ** as follows: |
| ** |
| ** "Redistribution and use in source and binary forms, with or without |
| ** modification, are permitted provided that the following conditions are |
| ** met: |
| ** * Redistributions of source code must retain the above copyright |
| ** notice, this list of conditions and the following disclaimer. |
| ** * Redistributions in binary form must reproduce the above copyright |
| ** notice, this list of conditions and the following disclaimer in |
| ** the documentation and/or other materials provided with the |
| ** distribution. |
| ** * Neither the name of The Qt Company Ltd nor the names of its |
| ** contributors may be used to endorse or promote products derived |
| ** from this software without specific prior written permission. |
| ** |
| ** |
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| // Use QtQuick 2.8 to get GraphicsInfo and the other new properties |
| import QtQuick 2.8 |
| |
| Item { |
| Rectangle { |
| color: "gray" |
| anchors.margins: 10 |
| anchors.fill: parent |
| Image { |
| id: image1 |
| source: "qrc:/qt.png" |
| } |
| ShaderEffectSource { |
| id: effectSource1 |
| sourceItem: image1 |
| hideSource: true |
| } |
| ShaderEffect { // wobble |
| id: eff |
| width: image1.width |
| height: image1.height |
| anchors.centerIn: parent |
| |
| property variant source: effectSource1 |
| property real amplitude: 0.04 * 0.2 |
| property real frequency: 20 |
| property real time: 0 |
| |
| NumberAnimation on time { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 600 } |
| |
| property bool customVertexShader: false // the effect is fine with the default vs, but toggle this to test |
| property bool useHLSLSourceString: false // toggle to provide HLSL shaders as strings instead of bytecode in files |
| |
| property string glslVertexShader: |
| "uniform highp mat4 qt_Matrix;" + |
| "attribute highp vec4 qt_Vertex;" + |
| "attribute highp vec2 qt_MultiTexCoord0;" + |
| "varying highp vec2 qt_TexCoord0;" + |
| "void main() {" + |
| " qt_TexCoord0 = qt_MultiTexCoord0;" + |
| " gl_Position = qt_Matrix * qt_Vertex;" + |
| "}" |
| |
| property string glslFragmentShader: |
| "uniform sampler2D source;" + |
| "uniform highp float amplitude;" + |
| "uniform highp float frequency;" + |
| "uniform highp float time;" + |
| "uniform lowp float qt_Opacity;" + |
| "varying highp vec2 qt_TexCoord0;" + |
| "void main() {" + |
| " highp vec2 p = sin(time + frequency * qt_TexCoord0);" + |
| " gl_FragColor = texture2D(source, qt_TexCoord0 + amplitude * vec2(p.y, -p.x)) * qt_Opacity;" + |
| "}" |
| |
| property string hlslVertexShader: "cbuffer ConstantBuffer : register(b0) {" + |
| " float4x4 qt_Matrix;" + |
| " float qt_Opacity; }" + |
| "struct PSInput {" + |
| " float4 position : SV_POSITION;" + |
| " float2 coord : TEXCOORD0; };" + |
| "PSInput main(float4 position : POSITION, float2 coord : TEXCOORD0) {" + |
| " PSInput result;" + |
| " result.position = mul(qt_Matrix, position);" + |
| " result.coord = coord;" + |
| " return result;" + |
| "}"; |
| |
| property string hlslPixelShader:"cbuffer ConstantBuffer : register(b0) {" + |
| " float4x4 qt_Matrix;" + |
| " float qt_Opacity;" + |
| " float amplitude;" + |
| " float frequency;" + |
| " float time; }" + |
| "Texture2D source : register(t0);" + |
| "SamplerState sourceSampler : register(s0);" + |
| "float4 main(float4 position : SV_POSITION, float2 coord : TEXCOORD0) : SV_TARGET" + |
| "{" + |
| " float2 p = sin(time + frequency * coord);" + |
| " return source.Sample(sourceSampler, coord + amplitude * float2(p.y, -p.x)) * qt_Opacity;" + |
| "}"; |
| |
| property string hlslVertexShaderByteCode: "qrc:/vs_wobble.cso" |
| property string hlslPixelShaderByteCode: "qrc:/ps_wobble.cso" |
| |
| vertexShader: customVertexShader ? (GraphicsInfo.shaderType === GraphicsInfo.HLSL |
| ? (useHLSLSourceString ? hlslVertexShader : hlslVertexShaderByteCode) |
| : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? glslVertexShader : "")) : "" |
| |
| fragmentShader: GraphicsInfo.shaderType === GraphicsInfo.HLSL |
| ? (useHLSLSourceString ? hlslPixelShader : hlslPixelShaderByteCode) |
| : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? glslFragmentShader : "") |
| } |
| |
| Image { |
| id: image2 |
| source: "qrc:/face-smile.png" |
| } |
| ShaderEffectSource { |
| id: effectSource2 |
| sourceItem: image2 |
| hideSource: true |
| } |
| ShaderEffect { // dropshadow |
| id: eff2 |
| width: image2.width |
| height: image2.height |
| scale: 2 |
| x: 40 |
| y: 40 |
| |
| property variant source: effectSource2 |
| |
| property string glslShaderPass1: " |
| uniform lowp float qt_Opacity; |
| uniform sampler2D source; |
| uniform highp vec2 delta; |
| varying highp vec2 qt_TexCoord0; |
| void main() { |
| gl_FragColor = (0.0538 * texture2D(source, qt_TexCoord0 - 3.182 * delta) |
| + 0.3229 * texture2D(source, qt_TexCoord0 - 1.364 * delta) |
| + 0.2466 * texture2D(source, qt_TexCoord0) |
| + 0.3229 * texture2D(source, qt_TexCoord0 + 1.364 * delta) |
| + 0.0538 * texture2D(source, qt_TexCoord0 + 3.182 * delta)) * qt_Opacity; |
| }" |
| property string glslShaderPass2: " |
| uniform lowp float qt_Opacity; |
| uniform highp vec2 offset; |
| uniform sampler2D source; |
| uniform sampler2D shadow; |
| uniform highp float darkness; |
| uniform highp vec2 delta; |
| varying highp vec2 qt_TexCoord0; |
| void main() { |
| lowp vec4 fg = texture2D(source, qt_TexCoord0); |
| lowp vec4 bg = texture2D(shadow, qt_TexCoord0 + delta); |
| gl_FragColor = (fg + vec4(0., 0., 0., darkness * bg.a) * (1. - fg.a)) * qt_Opacity; |
| }" |
| |
| property variant shadow: ShaderEffectSource { |
| sourceItem: ShaderEffect { |
| width: eff2.width |
| height: eff2.height |
| property variant delta: Qt.size(0.0, 1.0 / height) |
| property variant source: ShaderEffectSource { |
| sourceItem: ShaderEffect { |
| id: innerEff |
| width: eff2.width |
| height: eff2.height |
| property variant delta: Qt.size(1.0 / width, 0.0) |
| property variant source: effectSource2 |
| fragmentShader: GraphicsInfo.shaderType === GraphicsInfo.HLSL ? "qrc:/ps_shadow1.cso" : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? eff2.glslShaderPass1 : "") |
| } |
| } |
| fragmentShader: GraphicsInfo.shaderType === GraphicsInfo.HLSL ? "qrc:/ps_shadow1.cso" : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? eff2.glslShaderPass1: "") |
| } |
| } |
| property real angle: 0 |
| property variant offset: Qt.point(5.0 * Math.cos(angle), 5.0 * Math.sin(angle)) |
| NumberAnimation on angle { loops: Animation.Infinite; from: 0; to: Math.PI * 2; duration: 6000 } |
| property variant delta: Qt.size(offset.x / width, offset.y / height) |
| property real darkness: 0.5 |
| fragmentShader: GraphicsInfo.shaderType === GraphicsInfo.HLSL ? "qrc:/ps_shadow2.cso" : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? glslShaderPass2 : "") |
| } |
| |
| Column { |
| anchors.bottom: parent.bottom |
| Text { |
| color: "yellow" |
| font.pointSize: 24 |
| text: "Shader effect is " + (GraphicsInfo.shaderType === GraphicsInfo.HLSL ? "HLSL" : (GraphicsInfo.shaderType === GraphicsInfo.GLSL ? "GLSL" : "UNKNOWN")) + " based"; |
| } |
| Text { |
| text: GraphicsInfo.shaderType + " " + GraphicsInfo.shaderCompilationType + " " + GraphicsInfo.shaderSourceType |
| } |
| Text { |
| text: eff.status + " " + eff.log |
| } |
| } |
| } |
| } |