Revision control

Copy as Markdown

// Copyright (C) 2023 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
import QtQuick
import QtQuick3D
import QtQuick3D.Helpers
import QtQuick.Controls
import QtQuick.Layouts
Item {
id: root
View3D {
id: v3d
// Render to a texture (Underlay would work too)
renderMode: View3D.Offscreen
// Essential for HDR: use a (half-)float backing texture when renderMode is Offscreen
renderFormat: ShaderEffectSource.RGBA16F
anchors.fill: parent
anchors.margins: 16
environment: SceneEnvironment {
id: env
}
PerspectiveCamera {
id: camera1
z: 200
}
Model {
source: "#Cube"
scale: Qt.vector3d(2, 2, 2)
materials: PrincipledMaterial {
baseColorMap: tex
lighting: PrincipledMaterial.NoLighting
}
}
Texture {
id: tex
source: "file:PeckLake.hdr"
}
WasdController {
controlledObject: camera1
}
}
Rectangle {
// On Windows all SDR content should be corrected based on the SDR
// white level queried from the system. E.g. if it's reported as 240
// nits then colors should be multiplied by 240/80 = 3 (as 1.0 refers
// to 80 nits). Here there's no query, just a slider.
layer.enabled: levelCorrection.checked
layer.format: ShaderEffectSource.RGBA16F
layer.effect: ShaderEffect {
fragmentShader: "level.frag.qsb"
property real multiplier: whiteLevel.value
}
color: "gray"
anchors.right: parent.right
width: 320
height: 480
ColumnLayout {
GroupBox {
title: "2D content adjustment"
ColumnLayout {
Label {
text: "SDR white level correction\n(relevant if HDR mode is scene-referred, e.g. on Windows)\nMultiplier: " + whiteLevel.value.toFixed(1)
}
CheckBox {
text: "Enable"
id: levelCorrection
}
Slider {
id: whiteLevel
from: 0
to: 10
value: 1
}
}
}
GroupBox {
title: "Tonemapping for 3D content (with SDR in mind)"
ColumnLayout {
id: col
function updateTonemapping(mode) {
env.tonemapMode = mode
}
RadioButton {
text: "Linear (as in linear -> sRGB)"
checked: true
onCheckedChanged: col.updateTonemapping(SceneEnvironment.TonemapModeLinear)
}
RadioButton {
text: "Aces"
onCheckedChanged: col.updateTonemapping(SceneEnvironment.TonemapModeAces)
}
RadioButton {
text: "HejlDawson"
onCheckedChanged: col.updateTonemapping(SceneEnvironment.TonemapModeHejlDawson)
}
RadioButton {
text: "Filmic"
onCheckedChanged: col.updateTonemapping(SceneEnvironment.TonemapModeFilmic)
}
RadioButton {
text: "None"
onCheckedChanged: col.updateTonemapping(SceneEnvironment.TonemapModeNone)
}
}
}
Label {
function renderFormatStr() {
switch (v3d.renderFormat) {
case ShaderEffectSource.RGBA8:
return "RGBA8";
case ShaderEffectSource.RGBA16F:
return "RGBA16F";
case ShaderEffectSource.RGBA32F:
return "RGBA32F";
}
}
text: "View3D renderFormat is " + renderFormatStr()
}
}
}
}