| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- // Copyright (C) 2025 The Qt Company Ltd.
- // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
- import QtQuick
- import QtQuick3D
- import QtQuick3D.Helpers.impl
- SsgiEnvEffect {
- id: ssgiEffect
- property bool indirectLightEnabled: true
- property real indirectLightBoost: 4.0 // 1 - 100
- property real bufferSizeFactor: 0.5 // 0 - 1 (leave it at 0.5, generally)
- property bool simulatedBounceEnabled: false
- property real simulatedBounceFactor: 0.5 // 0 - 1
- property int sampleCount: 4 // 1 - 16
- property real sampleRadius: 0.1 // 0.001 - 4
- property int sliceCount: 4 // 1 - 8
- property real hitThickness: 0.5 // 0.001 - 4
- property int debugMode: 0 // internal; needs uncommenting ENABLE_DEBUG_MODE in all the shaders
- readonly property TextureInput indirectAndAoSampler: TextureInput {
- texture: Texture {}
- }
- readonly property TextureInput blurredIndirectAndAoSampler: TextureInput {
- texture: Texture {}
- }
- Buffer {
- id: indirectAndAoBuffer
- name: "indirectAndAoBuffer"
- sizeMultiplier: ssgiEffect.bufferSizeFactor
- format: Buffer.RGBA16F
- }
- Buffer {
- id: blurredIndirectAndAoBuffer
- name: "blurredIndirectAndAoBuffer"
- sizeMultiplier: ssgiEffect.bufferSizeFactor
- bufferFlags: Buffer.SceneLifetime // for simulatedBounce
- format: Buffer.RGBA16F
- }
- Shader {
- id: ssgiMainShader
- stage: Shader.Fragment
- shader: "qrc:/qtquick3d_helpers/shaders/ssgi_ssilvb.frag"
- }
- Shader {
- id: ssgiBlurDownShader
- stage: Shader.Fragment
- shader: "qrc:/qtquick3d_helpers/shaders/ssgi_dualfilterblur_down.frag"
- }
- Shader {
- id: ssgiBlurUpShader
- stage: Shader.Fragment
- shader: "qrc:/qtquick3d_helpers/shaders/ssgi_dualfilterblur_up.frag"
- }
- Shader {
- id: ssgiComposeShader
- stage: Shader.Fragment
- shader: "qrc:/qtquick3d_helpers/shaders/ssgi_compose.frag"
- }
- Pass {
- id: ssaoAndIndirectPass
- output: indirectAndAoBuffer
- shaders: ssgiMainShader
- commands: [
- // for simulatedBounce
- BufferInput {
- // because it is SceneLifetime, so here this is the result from the previous frame
- buffer: blurredIndirectAndAoBuffer
- sampler: "blurredIndirectAndAoSampler"
- }
- ]
- }
- // Kawase / dual filter blur
- // https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_notes.pdf
- Buffer {
- id: tempBuffer1
- name: "tempBuffer1"
- sizeMultiplier: ssgiEffect.bufferSizeFactor * 0.5
- format: Buffer.RGBA16F
- }
- Buffer {
- id: tempBuffer2
- name: "tempBuffer2"
- sizeMultiplier: ssgiEffect.bufferSizeFactor * 0.5 * 0.5
- format: Buffer.RGBA16F
- }
- Pass {
- id: indirectLightBufferBlurDownInputTo1
- output: tempBuffer1
- shaders: ssgiBlurDownShader
- commands: [
- BufferInput {
- buffer: indirectAndAoBuffer
- }
- ]
- }
- Pass {
- id: indirectLightBufferBlurDown1To2
- output: tempBuffer2
- shaders: ssgiBlurDownShader
- commands: [
- BufferInput {
- buffer: tempBuffer1
- }
- ]
- }
- Pass {
- id: indirectLightBufferBlurUp2To1
- output: tempBuffer1
- shaders: ssgiBlurUpShader
- commands: [
- BufferInput {
- buffer: tempBuffer2
- }
- ]
- }
- Pass {
- id: indirectLightBufferBlurUp1ToOutput
- output: blurredIndirectAndAoBuffer
- shaders: ssgiBlurUpShader
- commands: [
- BufferInput {
- buffer: tempBuffer1
- }
- ]
- }
- Pass {
- id: ssgiCompositionPass
- shaders: ssgiComposeShader
- commands: [
- BufferInput {
- buffer: blurredIndirectAndAoBuffer
- sampler: "blurredIndirectAndAoSampler"
- }
- ]
- }
- passes:
- [ ssaoAndIndirectPass,
- indirectLightBufferBlurDownInputTo1, indirectLightBufferBlurDown1To2,
- indirectLightBufferBlurUp2To1, indirectLightBufferBlurUp1ToOutput,
- ssgiCompositionPass
- ]
- }
|