Files
RedBear-OS/recipes/wip/qt/qtquick3d/source/examples/quick3d/customeffect/main.qml
T
vasilito ff4ff35918 feat: track all source trees in git — full fork offline-first model
Red Bear OS is a full fork. All sources must be available from git clone
with zero network access. Removed gitignore rules that excluded fetched
source trees under recipes/*/source/, local/recipes/kde/*/source/,
local/recipes/qt/*/source/, and vendor source trees.

Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded.

127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt
frameworks, mesa, wayland, DRM drivers, and every other recipe source.
2026-05-14 10:55:53 +01:00

231 lines
6.3 KiB
QML

// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import QtQuick
import QtQuick3D
import QtQuick3D.Helpers
import QtQuick.Controls
import QtQuick.Layouts
Window {
id: window
width: 1280
height: 720
visible: true
title: "Custom Post-Processing Effect Example"
color: "#848895"
View3D {
id: view3d
//! [eff1]
Effect {
id: eff1
property TextureInput tex: TextureInput {
id: qtLogo
texture: Texture { source: "qt_logo_rect.png" }
}
passes: Pass {
shaders: Shader {
id: fs1
stage: Shader.Fragment
shader: "effect.frag"
}
}
}
//! [eff1]
//! [eff2]
Effect {
id: eff2
property real uRed: 0.0
SequentialAnimation {
running: radioEff2.checked || radioEff3.checked
loops: Animation.Infinite
NumberAnimation { target: eff2; property: "uRed"; from: 0; to: 1; duration: 2000 }
NumberAnimation { target: eff2; property: "uRed"; from: 1; to: 0; duration: 2000 }
}
property real uGreen: 1.0
Shader {
id: vs2
stage: Shader.Vertex
shader: "effect2.vert"
}
Shader {
id: fs2
stage: Shader.Fragment
shader: "effect2.frag"
}
passes: Pass {
shaders: [ vs2, fs2 ]
}
}
//! [eff2]
Effect {
id: eff3
property TextureInput tex: qtLogo
property real uRed: 1.0
property real uGreen: 0.0
SequentialAnimation {
running: radioEff4.checked
loops: Animation.Infinite
NumberAnimation { target: eff3; property: "uGreen"; from: 0; to: 1; duration: 2000 }
NumberAnimation { target: eff3; property: "uGreen"; from: 1; to: 0; duration: 2000 }
}
Buffer {
id: intermediateTexture
name: "intermediateTexture"
format: Buffer.RGBA8
textureFilterOperation: Buffer.Linear
textureCoordOperation: Buffer.ClampToEdge
sizeMultiplier: 2 // just for fun upscale and then downscale
}
passes: [
Pass {
shaders: [ fs1 ]
output: intermediateTexture
},
Pass {
shaders: [ vs2, fs2 ]
commands: [
BufferInput {
buffer: intermediateTexture
}
]
}
]
}
anchors.fill: parent
renderMode: View3D.Offscreen
environment: SceneEnvironment {
id: env
clearColor: "skyblue"
backgroundMode: SceneEnvironment.Color
effects: [ eff1 ]
}
PerspectiveCamera {
id: camera
position: Qt.vector3d(0, 200, 300)
eulerRotation.x: -20
}
DirectionalLight {
eulerRotation.x: -20
eulerRotation.y: 20
ambientColor: Qt.rgba(0.8, 0.8, 0.8, 1.0);
}
Texture {
id: checkers
source: "checkers2.png"
scaleU: 20
scaleV: 20
tilingModeHorizontal: Texture.Repeat
tilingModeVertical: Texture.Repeat
}
Model {
source: "#Rectangle"
scale.x: 10
scale.y: 10
eulerRotation.x: -90
materials: [ PrincipledMaterial { baseColorMap: checkers } ]
}
Model {
source: "#Cone"
position: Qt.vector3d(100, 0, -200)
scale.y: 3
materials: [ PrincipledMaterial { baseColor: "green" } ]
}
Model {
id: sphere
source: "#Sphere"
position: Qt.vector3d(-100, 200, -200)
materials: [ PrincipledMaterial { baseColor: "#808000" } ]
}
Model {
source: "#Cube"
position.y: 50
eulerRotation.y: 20
materials: [ PrincipledMaterial { baseColor: "gray" } ]
}
}
WasdController {
controlledObject: camera
}
ColumnLayout {
Label {
text: "Use WASD and mouse to navigate"
font.bold: true
}
ButtonGroup {
buttons: [ radioEff1, radioEff2, radioEff3, radioEff4, radioEff5 ]
}
// qmllint disable read-only-property
// QTBUG-114144
RadioButton {
id: radioEff1
text: "Custom effect with fragment shader only"
checked: true
focusPolicy: Qt.NoFocus
onCheckedChanged: {
if (checked)
env.effects = [ eff1 ];
}
}
RadioButton {
id: radioEff2
text: "Custom effect with vertex and fragment shaders"
checked: false
focusPolicy: Qt.NoFocus
onCheckedChanged: {
if (checked)
env.effects = [ eff2 ];
}
}
RadioButton {
id: radioEff3
text: "Both effects chained"
checked: false
focusPolicy: Qt.NoFocus
onCheckedChanged: {
if (checked)
env.effects = [ eff1, eff2 ];
}
}
RadioButton {
id: radioEff4
text: "As one single, multi-pass effect"
checked: false
focusPolicy: Qt.NoFocus
onCheckedChanged: {
if (checked)
env.effects = [ eff3 ];
}
}
RadioButton {
id: radioEff5
text: "No effects"
checked: false
focusPolicy: Qt.NoFocus
onCheckedChanged: {
if (checked)
env.effects = [];
}
}
// qmllint disable read-only-property
}
}