diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2024-05-02 13:42:21 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2024-05-07 11:41:55 +0200 |
commit | 31980a6537b0d6452e7893e7ba336d4fd0604e50 (patch) | |
tree | b150d6ad0f9fba6a4bc3f18635d6a7d54bf9cf75 | |
parent | 8acd93a4b78bb114c3d300c830f7aa4585fb2ab6 (diff) |
Start enabling postproc effects in multiview mode
Won't work still, but for reasons different than before.
Plus some qmlxr test assets.
Change-Id: Ia7a81b0310d4006b14354e5d897493a73b142537
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/quick3d/qquick3dscenerenderer.cpp | 6 | ||||
-rw-r--r-- | src/runtimerender/qssgrhieffectsystem.cpp | 10 | ||||
-rw-r--r-- | src/runtimerender/qssgrhieffectsystem_p.h | 3 | ||||
-rw-r--r-- | tests/manual/qmlxr/testscenes/effect.qml | 77 | ||||
-rw-r--r-- | tests/manual/qmlxr/testscenes/maps/checkers2.png | bin | 0 -> 192 bytes | |||
-rw-r--r-- | tests/manual/qmlxr/testscenes/spiral.frag | 15 | ||||
-rw-r--r-- | tests/manual/qmlxr/testscenes/spiral.vert | 6 | ||||
-rw-r--r-- | tools/shadergen/genshaders.cpp | 3 |
8 files changed, 113 insertions, 7 deletions
diff --git a/src/quick3d/qquick3dscenerenderer.cpp b/src/quick3d/qquick3dscenerenderer.cpp index 992935e8..5576b0da 100644 --- a/src/quick3d/qquick3dscenerenderer.cpp +++ b/src/quick3d/qquick3dscenerenderer.cpp @@ -297,7 +297,7 @@ QRhiTexture *QQuick3DSceneRenderer::renderToRhiTexture(QQuickWindow *qw) // renderer needs to know the value. rhiCtxD->setMainPassSampleCount(m_msaaRenderBuffer ? m_msaaRenderBuffer->sampleCount() : 1); - rhiCtxD->setMainPassViewCount(1); // ### multiview for postproc effects? + // mainPassViewCount is left unchanged int ssaaAdjustedWidth = m_surfaceSize.width(); int ssaaAdjustedHeight = m_surfaceSize.height(); @@ -1483,7 +1483,11 @@ void QQuick3DSGDirectRenderer::prepare() if (m_renderer->m_postProcessingStack) { if (renderPending) { renderPending = false; + // Make sure stuff on the rhiContext is set before invoking + // renderToRhiTexture() since the effect system may rely on some of it. + queryMainRenderPassDescriptorAndCommandBuffer(m_window, m_renderer->m_sgContext->rhiContext().get()); m_rhiTexture = m_renderer->renderToRhiTexture(m_window); + // Set up the main render target again, the effect stuff may have changed some settings (e.g. the sample count). queryMainRenderPassDescriptorAndCommandBuffer(m_window, m_renderer->m_sgContext->rhiContext().get()); const auto &quadRenderer = m_renderer->m_sgContext->renderer()->rhiQuadRenderer(); quadRenderer->prepareQuad(m_renderer->m_sgContext->rhiContext().get(), nullptr); diff --git a/src/runtimerender/qssgrhieffectsystem.cpp b/src/runtimerender/qssgrhieffectsystem.cpp index 834f30ee..965437e2 100644 --- a/src/runtimerender/qssgrhieffectsystem.cpp +++ b/src/runtimerender/qssgrhieffectsystem.cpp @@ -381,7 +381,8 @@ QSSGRhiShaderPipelinePtr QSSGRhiEffectSystem::buildShaderForEffect(const QSSGBin QSSGProgramGenerator &generator, QSSGShaderLibraryManager &shaderLib, QSSGShaderCache &shaderCache, - bool isYUpInFramebuffer) + bool isYUpInFramebuffer, + int viewCount) { const auto &key = inCmd.m_shaderPathKey; qCDebug(lcEffectSystem) << " generating new shader pipeline for: " << key; @@ -407,7 +408,7 @@ QSSGRhiShaderPipelinePtr QSSGRhiEffectSystem::buildShaderForEffect(const QSSGBin shaderLib, shaderCache, QSSGRhiShaderPipeline::UsedWithoutIa, - 1, // ### multiview for postproc effects? + viewCount, false); } @@ -420,7 +421,8 @@ void QSSGRhiEffectSystem::bindShaderCmd(const QSSGBindShader *inCmd, const QSSGR m_pendingClears.clear(); m_currentShaderPipeline = nullptr; - QRhi *rhi = m_sgContext->rhiContext()->rhi(); + const auto &rhiCtx = m_sgContext->rhiContext(); + QRhi *rhi = rhiCtx->rhi(); const auto &shaderLib = m_sgContext->shaderLibraryManager(); const auto &shaderCache = m_sgContext->shaderCache(); @@ -486,7 +488,7 @@ void QSSGRhiEffectSystem::bindShaderCmd(const QSSGBindShader *inCmd, const QSSGR Q_TRACE_SCOPE(QSSG_generateShader); Q_QUICK3D_PROFILE_START(QQuick3DProfiler::Quick3DGenerateShader); const auto &generator = m_sgContext->shaderProgramGenerator(); - if (auto stages = buildShaderForEffect(*inCmd, *generator, *shaderLib, *shaderCache, rhi->isYUpInFramebuffer())) { + if (auto stages = buildShaderForEffect(*inCmd, *generator, *shaderLib, *shaderCache, rhi->isYUpInFramebuffer(), rhiCtx->mainPassViewCount())) { m_shaderPipelines.insert(cacheKey, stages); m_currentShaderPipeline = stages.get(); } diff --git a/src/runtimerender/qssgrhieffectsystem_p.h b/src/runtimerender/qssgrhieffectsystem_p.h index 102a27ca..64c3b2b4 100644 --- a/src/runtimerender/qssgrhieffectsystem_p.h +++ b/src/runtimerender/qssgrhieffectsystem_p.h @@ -78,7 +78,8 @@ public: QSSGProgramGenerator &generator, QSSGShaderLibraryManager &shaderLib, QSSGShaderCache &shaderCache, - bool isYUpInFramebuffer); + bool isYUpInFramebuffer, + int viewCount); private: void releaseResources(); diff --git a/tests/manual/qmlxr/testscenes/effect.qml b/tests/manual/qmlxr/testscenes/effect.qml new file mode 100644 index 00000000..564d8cee --- /dev/null +++ b/tests/manual/qmlxr/testscenes/effect.qml @@ -0,0 +1,77 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +import QtQuick +import QtQuick3D + +Node { + property vector3d qmlxr_originPosition: Qt.vector3d(0, 200, 300) + property vector3d qmlxr_originRotation: Qt.vector3d(-20, 0, 0) + + property SceneEnvironment qmlxr_environment: SceneEnvironment { + clearColor: "skyblue" + backgroundMode: SceneEnvironment.Color + + effects: [ spiralEffect ] + } + + Effect { + id: spiralEffect + passes: Pass { + shaders: [ + Shader { + stage: Shader.Vertex + shader: "spiral.vert" + }, + Shader { + stage: Shader.Fragment + shader: "spiral.frag" + } + ] + } + } + + DirectionalLight { + eulerRotation.x: -20 + eulerRotation.y: 20 + ambientColor: Qt.rgba(0.8, 0.8, 0.8, 1.0); + } + + Texture { + id: checkers + source: "maps/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: [ DefaultMaterial { diffuseMap: checkers } ] + } + + Model { + source: "#Cone" + position: Qt.vector3d(100, 0, -200) + scale.y: 3 + materials: [ DefaultMaterial { diffuseColor: "green" } ] + } + + Model { + id: sphere + source: "#Sphere" + position: Qt.vector3d(-100, 200, -200) + materials: [ DefaultMaterial { diffuseColor: "#808000" } ] + } + + Model { + source: "#Cube" + position.y: 50 + eulerRotation.y: 20 + materials: [ DefaultMaterial { diffuseColor: "gray" } ] + } +} diff --git a/tests/manual/qmlxr/testscenes/maps/checkers2.png b/tests/manual/qmlxr/testscenes/maps/checkers2.png Binary files differnew file mode 100644 index 00000000..b23f805e --- /dev/null +++ b/tests/manual/qmlxr/testscenes/maps/checkers2.png diff --git a/tests/manual/qmlxr/testscenes/spiral.frag b/tests/manual/qmlxr/testscenes/spiral.frag new file mode 100644 index 00000000..d951cadc --- /dev/null +++ b/tests/manual/qmlxr/testscenes/spiral.frag @@ -0,0 +1,15 @@ +VARYING vec2 center_vec; + +void MAIN() +{ + float radius = 0.25; + float dist_to_center = length(center_vec) / radius; + vec2 texcoord = INPUT_UV; + if (dist_to_center <= 1.0) { + float rotation_amount = (1.0 - dist_to_center) * (1.0 - dist_to_center); + float r = radians(360.0) * rotation_amount / 4.0; + mat2 rotation = mat2(cos(r), sin(r), -sin(r), cos(r)); + texcoord = vec2(0.5, 0.5) + rotation * (INPUT_UV - vec2(0.5, 0.5)); + } + FRAGCOLOR = texture(INPUT, texcoord); +} diff --git a/tests/manual/qmlxr/testscenes/spiral.vert b/tests/manual/qmlxr/testscenes/spiral.vert new file mode 100644 index 00000000..81a034f0 --- /dev/null +++ b/tests/manual/qmlxr/testscenes/spiral.vert @@ -0,0 +1,6 @@ +VARYING vec2 center_vec; +void MAIN() +{ + center_vec = INPUT_UV - vec2(0.5, 0.5); + center_vec.y *= INPUT_SIZE.y / INPUT_SIZE.x; +} diff --git a/tools/shadergen/genshaders.cpp b/tools/shadergen/genshaders.cpp index d561349c..5d87a180 100644 --- a/tools/shadergen/genshaders.cpp +++ b/tools/shadergen/genshaders.cpp @@ -313,7 +313,8 @@ bool GenShaders::process(const MaterialParser::SceneData &sceneData, *shaderProgramGenerator, *shaderLibraryManager, *shaderCache, - isYUpInFramebuffer); + isYUpInFramebuffer, + 1); // no multiview support here yet if (shaderPipeline) { const auto &key = bindShaderCommand.m_shaderPathKey; const QSSGShaderFeatures features = shaderLibraryManager->getShaderMetaData(key, QSSGShaderCache::ShaderType::Fragment).features; |