多视图渲染
多视图渲染是指将绘制调用实例化到 2D 纹理阵列的层中。在 Qt 中,它尤其适用于使用Qt Quick 3D Xr 构建的 VR/AR 应用程序。多视图渲染不需要独立完成场景遍历、渲染准备和左右眼内容的渲染记录,而是一次完成,将单次渲染中的绘制调用实例化到纹理数组的第 0 层和第 1 层。顶点着色器使用一个特殊变量来指示视图索引,并以此为基础计算每个视图的数值。必须为双眼提供包含视图相关数据(如摄像机矩阵)的制服。多视图渲染有望减少渲染器对系统的负载,从而提高性能。但代价是必须让渲染器和着色器知道如何处理视图相关数据和纹理阵列。
底层概述
Qt 应用程序开发人员不一定需要全面了解 Qt 渲染堆栈低层如何启用多视图渲染。以下链接可供希望了解更多底层细节的开发人员使用。
3D API 中的多视图支持
只有当底层 3D API 在运行时支持多视图渲染时,多视图渲染才可用。有关详细信息,请参阅相应的规范和文档:
- OpenGL:OVR_multiview1和OVR_multiview2
- Vulkan:VK_KHR_multiview
- Direct 3D 12:ViewInstancing
- Metal:rendering_too_multiple_texture_slices
Qt 渲染硬件接口 (RHI) 中的多视图支持
在 Qt 中,3D 图形 API 被QRhi 类抽象化。Qt Quick 和Qt Quick 3D 的所有加速渲染都使用这一基础架构。有关多视图渲染支持的更多底层信息,请参阅下文:
Qt Quick - Quick 3D - Quick 3D XR 堆栈中的多视图支持
中的多视图支持Qt Quick
Qt Quick 是多视图感知的,但绝不会单独使用多视图呈现。当 2D 元素嵌入到 3D 场景中时,支持多视图渲染与 结合使用就变得非常重要。要在三维场景输出到多视图呈现目标时正确呈现二维内容,二维呈现器及其材质(着色器)必须为多视图支持做好准备。Qt Quick 3D
基于 Qt XML 的应用程序的开发人员在很多情况下不需要考虑这一点,因为Qt Quick 的内置材质(如Rectangle,Image 或Text 等项目)都与多视图兼容。
不过,当开发自定义材质(QSGMaterial,QSGMaterialShader )或为ShaderEffect 编写着色器,并打算在Qt Quick 3D Xr 应用程序的 VR/AR 场景中使用这些 2D 内容时,自定义内容必须具有多视图感知能力。有关详情,请参阅QSGMaterial::viewCount() 。
Qt 的着色器调节管道支持编写多视图感知着色器。详见QSB Manual和QtShader Tools Build System Integration中的多视图部分。
多视图支持Qt Quick 3D
Qt Quick 3D 不使用 Xr 的应用程序(即非 VR/AR 应用程序)目前无法使用多视图渲染。不过,3D 渲染器完全支持多视图,因为 Xr 建立在相同的基础架构上。所有标准的内置功能(如 或 )都完全兼容多视图。一些过时的功能(如旧的独立特效模块)可能不支持多视图渲染。Qt Quick 3D Qt Quick 3D Model PrincipledMaterial
当CustomMaterial 或Effect 中涉及自定义着色器片段时,需要在编写应用程序提供的着色器代码时考虑到多视图支持,以便在启用多视图渲染的Qt Quick 3D Xr 应用程序中正常运行。如何实现这一点,请参阅这些类型的文档。这一点尤为重要的特殊关键字是VIEW_INDEX
,INPUT
,SCREEN_TEXTURE
,DEPTH_TEXTURE
,AO_TEXTURE
。
例如,下面的后处理效果与多视图兼容,因为它是为INPUT
是sampler2DArray
而不是sampler2D
的情况准备的:
void MAIN() { vec4 c = texture(someTexture, TEXTURE_UV); // ... #if QSHADER_VIEW_COUNT >= 2 FRAGCOLOR = c * texture(INPUT, vec3(INPUT_UV, VIEW_INDEX)); #else FRAGCOLOR = c * texture(INPUT, INPUT_UV); #endif }
Qt Quick 3D Xr 中的多视图支持
只要底层图形应用程序接口支持多视图渲染,默认情况下就会启用多视图渲染。这样做是为了确保最佳性能。要查询是否支持多视图渲染,请检查multiViewRenderingSupported 属性。
出于开发和测试目的,禁用多视图呈现可能很有用。具体方法是将环境变量QT_QUICK3D_XR_DISABLE_MULTIVIEW
设置为非零值。
要查询多视图渲染是否启用,请使用multiViewRenderingEnabled 属性。如果无法启用多视图渲染,该值始终为 false。
一般来说,建议 VR/AR 应用程序在支持多视图呈现时启用多视图呈现,只有在遇到问题或出于测试目的时才禁用多视图呈现。多视图呈现有望提高性能,减少 GPU,尤其是 CPU 负载。
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.