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