翻譯|使用教程|編輯:鮑佳佳|2020-10-30 10:30:27.817|閱讀 6445 次
概述:對于Qt Quick,Qt 5.14中提供了新渲染架構的早期選擇加入預覽,Qt 5.15中進行了一些改進。隨著即將發布的Qt 6.0,讓我們看看自Qt 5.15以來發生了什么。這里不可能涵蓋Qt Quick圖形堆棧改進的每個細節,更不用說深入了解大量Qt Quick 3D功能了,其中許多功能是Qt 6.0中的新增功能或改進功能。相反,其目的僅僅是從今年晚些時候發布Qt 6.0時從圖形堆棧的角度給出預期的概述。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Qt技術交流群現已開通,QQ搜索群號“765444821”即可加入!
Qt是一個跨平臺框架,通常用作圖形工具包,它不僅創建CLI應用程序中非常有用。而且它也可以在三種主要的臺式機操作系統以及移動操作系統(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設備,Android(Necessitas)和iOS的端口上運行?,F在我們為你提供了免費的試用版。趕快點擊下載Qt最新試用版吧>>
【Qtitan組件集】
慧都現推出“軟件國產化服務季”(點擊查看詳情),Qt正版授權獲取低價優惠>>
對于Qt Quick,Qt 5.14中提供了新渲染架構的早期選擇加入預覽,Qt 5.15中進行了一些改進。隨著即將發布的Qt 6.0,讓我們看看自Qt 5.15以來發生了什么。這里不可能涵蓋Qt Quick圖形堆棧改進的每個細節,更不用說深入了解大量Qt Quick 3D功能了,其中許多功能是Qt 6.0中的新增功能或改進功能。相反,其目的僅僅是從今年晚些時候發布Qt 6.0時從圖形堆棧的角度給出預期的概述。
請注意,文檔鏈接引用了Qt 6快照文檔。這樣可以查看最新的C ++和QML API頁面,包括所有已更改的功能和新功能,但是內容也不是最終的。這些鏈接也可能在以后斷開。
QRhi改進
Qhi,Qt渲染硬件接口QRhi,當涉及3D API(例如OpenGL,Vulkan,Metal和Direct 3D)時,是Qt的內部圖形抽象。與5.15相比,6.0的主要改進是在此進行了許多拋光修復,最重要的是,進行了大量性能優化。雖然也使Qt Quick受益,但是當涉及到具有許多可渲染對象的復雜場景時,這些對于Qt Quick 3D尤為重要。
通過一些簡化,Qt 6.0圖形堆棧的主要層可以像這樣可視化:
Shader management
現在,Qt Shader Tools模塊是安裝程序中的可選模塊。對于應用程序來說,這可能是有意義的,因為這是提供qsb命令行工具(不要與qbs混淆)及其相關的CMake構建系統集成的模塊。此外,該模塊目前是Qt Quick 3D的必需依賴項。
Qt 6不再直接使用兼容OpenGL的GLSL源代碼片段。相反,所有著色器都是以Vulkan樣式的GLSL編寫的,然后被反射并翻譯為其他著色語言,最后打包為可序列化的QShader對象,QRhi可以使用該對象。Qt 6中的著色器準備管道如下:
在使用Qt Quick的QML應用程序中,每當使用ShaderEffect或將QSGMaterialShader子類化時,應用程序將需要以.qsb文件的形式提供烘焙的著色器包。這些是由qsb工具生成的。但是,這并不意味著開發人員必須直接開始使用新工具:通過CMake集成,可以通過qt6_add_shaders()CMake函數輕松地在CMakeLists.txt中列出頂點,片段和計算著色器。調用qsb并將生成的.qsb文件打包到Qt資源系統中,然后由構建系統處理。
Direct OpenGL不再適用于Qt Quick
在Qt 5.14和5.15中,Qt Quick附帶了一個可選的基于QRhi的渲染路徑,可以通過設置環境變量QSG_RHI來啟用它。這樣就可以輕松地嘗試新堆棧,同時將經過戰役測試的傳統OpenGL直接代碼路徑保留為默認值。
在Qt 6.0中,所有此類開關均已消失。無法使用Qt Quick場景將渲染直接轉到OpenGL。相反,新的默認設置是Qt Quick場景圖的基于QRhi的渲染路徑。除了更改默認值外,與Qt 5.15相比,配置哪種QRhi后端以及使用哪種圖形API的方法幾乎沒有變化。
但是有一些影響,盡管許多應用程序不會注意到這些。如果一個應用程序既不使用著色器代碼(ShaderEffect,QSGMaterial),也不直接用OpenGL執行自己的渲染,那么它很有可能完全不需要遷移步驟。(至少不會因為圖形的原因)
直接使用OpenGL的應用程序
那么那些以某種方式直接使用OpenGL,而對其他圖形API的功能不感興趣的應用程序呢?例如,使用QQuickFramebufferObject,或者連接到QQuickWindow::beforeRendering()這樣的信號,在Qt Quick場景下或上面注入自己的OpenGL渲染的應用程序。這時,上面提到的setGraphicsApi()函數就會真正發揮作用:如果應用程序愿意,它可以隨時聲明它只想要OpenGL(或Vulkan,或Metal,或D3D),而不想要其他的。這樣就可以保證Qt Quick要使用相應的QRhi后端(否則會初始化失?。?,所以應用程序可以放心地認為直接去使用OpenGL是安全的,因為Qt Quick最終也會通過OpenGL進行渲染。請注意,這并不能免除應用程序必須進行其他類型的移植步驟:例如,如果它另外使用ShaderEffect或創建自己的自定義材質,它仍然需要遷移到處理著色器和材質的新方法。
QSG*和QQuick* API變化
API的變化主要分為3類。這不會是一個詳盡的列表,而只是對一些重要變化的窺探。詳細的變化列表和移植指南預計將在Qt 6.0最終發布時提供。
不同的著色器和材質的方法。QSGMaterialShader得到了全面的改版(與現在被移除的QSGMaterialRhiShader在5.14和5.15中的功能多少有些匹配)。ShaderEffect不再允許內聯shader字符串。相反,vertexShader和fragmentShader屬性是URL,類似于Image.source和其他屬性。它們可以引用本地的.qsb文件,或者通過Qt資源系統(qrc)嵌入的.qsb文件。
從QQuickWindow、QSGTexture和其他地方刪除OpenGL的特定功能。像 GLuint textureId()、createTextureFromId(GLuint textureId, ...)、setRenderTarget(GLuint fboId)這樣的函數現在已經消失了,這一點也不奇怪。采用(包裝)一個現有的OpenGL紋理、Vulkan圖像、Metal紋理或D3D11紋理,或者訪問QSGTexture的底層原生紋理仍然是完全可能的,但現在是通過一組不同的API來完成的,比如QSGVulkanTexture和其他類似的類,其實例可以從QSGTexure中查詢。
將應用程序自己的自定義渲染與Qt Quick渲染的圖形API整合在一起是完全支持的,不僅是OpenGL,還包括Vulkan、Metal和D3D11。然而由于它們的性質,其中一些API需要的不僅僅是連接到一個單一的信號,比如beforeRendering()或afterRendering()。例如,我們現在還有beforeRenderPassRecording()。更多細節和示例鏈接請參見scenegraph概述文檔中的相關章節。最后,可通過QSGRendererInterface查詢的本地圖形資源的數量已經擴展,現在也涵蓋了Vulkan、Metal和Direct 3D。
在ShaderEffect中處理著色器代碼的新方法
ShaderEffect中的著色器代碼新方法的綜合示例是經典Qt 5 Cinematic Experience演示的Qt 6端口。(GitHub存儲庫)此版本已移植到CMake,并與所有圖形API(包括所有著色器和粒子效果)完全兼容。
查看QML源代碼,例如,簾效果的代碼顯示確實刪除了所有內聯GLSL字符串。
取而代之的是,頂點著色器和片段著色器現在作為源文件中的普通文件存在,不再與應用程序可執行文件捆綁在一起。
現在,由構建系統和Qt Shader Tools來在構建時進行編譯,反映和轉換-著色器編譯錯誤的額外好處是變成了正確的構建錯誤,而不是模糊的運行時問題!-然后將生成的.qsb文件與應用程序捆綁在一起。這就是qt6_add_shaders()函數在項目的CMakeLists.txt中實現的功能
建議那些對某些較低級別主題感興趣的人,例如直接使用場景圖或將3D渲染代碼與其集成,請查看Qt附帶的場景圖示例的修訂列表,請參閱此處的“場景圖”部分。所有這些都已針對Qt 6.0進行了更新,而其中一些是全新的。
例如,專門介紹了“自定義材質”示例,重點關注如何實現使用其自身材質的自定義QQuickItem。
同樣值得注意的是圖形API特定示例,這些示例遵循Qt 5的openglunderqml示例,現在演示了如何使用Vulkan,Metal和Direct3D 11實現相同的功能。自然地,這些示例僅適用于所涉及的圖形API。查看它們的main()函數將顯示它們都強制執行了相關的RHI后端。
其中一些方法比經典的底圖/疊加方法更進一步。例如,metaltextureimport和vulkantextureimport示例演示了如何向場景添加QQuickItem,該場景實際上是帶紋理的四邊形,并使用MTLTexture或VkImage進行紋理化,該MTLTexture或VkImage可以創建并渲染到Qt Quick Scenegraph的控件之外。
Qt Quick 3D不再支持Direct OpenGL
在Qt 5.15中,主要新聞是Qt Quick 3D的引入,使3D世界,3D模型和PBR材料成為Qt Quick世界的頭等公民。從許多方面講,這只是Qt 6.0即將發布的預覽。
雖然在Qt 5.15中仍與OpenGL綁定,但Qt 6.0附帶了Qt Quick 3D的新內部組件,現在基于QRhi的基礎結構。如文檔頁面所述,適用于Qt Quick的配置選項也隱式適用于Qt Quick 3D。例如,如果通過設置QSG_RHI_BACKEND = vulkan或使用等效的C ++ API將Qt Quick配置為使用Vulkan,則同樣適用于Qt Quick 3D。
與Qt中如何處理著色器的常規更新一致,自定義材質的概念在Qt 6.0中也經歷了重大轉變?,F在,Qt Quick 3D材質系統有了一個全新的擴展,可以創建可編程的材質,其中網格的著色方式由應用程序提供的著色器代碼控制,該代碼以Vulkan兼容的GLSL代碼片段的形式提供,并通過Qt的標準如上所述的著色器管道,因此在運行時可與任何受支持的圖形API一起發揮功能,同時仍被引擎進行修改以執行所有預期的照明,陰影,遮擋和其他步驟,并將場景環境中的所有貢獻與應用程序提供的著色邏輯。
小部件呢?
QRhi部分中的圖提到了Widgets,盡管乍一看它位于一個奇怪的位置,遠離QRhi和Qt Quick。這試圖表明什么?
通常,所有在Qt 5中工作的東西都可以在Qt 6中工作,但已過時和現在已刪除的功能除外,例如所有帶有QGL前綴的Qt 4時代類(最著名的是QGLWidget)。如果Qt 5應用程序將其自己的OpenGL內容渲染到QWindow中,或使用QOpenGLWidget,它將全部像以前一樣運行。(在最壞的情況下,需要執行一些非常小的遷移步驟,例如,由于QOpenGLWidget移至其自己的模塊openglwidgets而必須更新應用程序項目文件)。
QRhi或新的著色器管道目前在這里不起作用,至少在Qt 6.0中不起作用。小部件的呈現類似于Qt 5,而QOpenGLWindow或QOpenGLWidget中的OpenGL內容繼續直接使用OpenGL API。
QQuickWidget是Qt 6.0中一個有趣的混合體,它將要求應用程序使用OpenGL來強制實施。這是因為盡管Qt Quick可以與其他圖形API一起使用,但小部件(QOpenGLWidget和QQuickWidget所依賴)中的合成架構暫時仍繼續直接使用OpenGL。
一個值得注意的變化是ANGLE的刪除,這意味著ANGLE在Windows上不再與Qt捆綁在一起。除了以某種形式依賴于ANGLE在幕后將OpenGL ES轉換為Direct 3D的應用程序外,這不會影響絕大多數應用程序。根據依賴關系的性質和復雜性,此類應用程序應考慮適當地啟用OpenGL的功能,或考慮直接使用Direct 3D。對于基于Qt Quick和Qt Quick 3D的應用程序,實際上沒有問題可能不是問題,因為Direct3D 11現在是Qt 6中的一流渲染選項。
到此為止。還有更多的Qt 6圖形主題需要討論,但是希望我們上面提供的內容為Qt 6.0中的更改和新功能提供了一個很好的起點。預計在不久的將來會有更多的帖子,特別是在Qt Quick 3D的情況下。
感謝您的閱讀,希望這篇文章能帶給你一定的幫助!如果這篇文章沒能滿足你的需求、點擊獲取更多文章教程!現在立刻下載Qt6免費試用吧!更多Qt類開發工具QtitanRibbon、QtitanChart、QtitanNavigation、QtitanDocking、QtitanDataGrid在線訂購現直降1000元,歡迎咨詢慧都獲取更多優惠>>
====================================================
想要了解或購買Qt正版授權的朋友,歡迎
Qt技術交流群現已開通,QQ搜索群號“765444821”或者掃描下方二維碼即可加入
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: