翻譯|使用教程|編輯:鮑佳佳|2020-11-04 10:55:05.170|閱讀 338 次
概述:自從發(fā)布了有關(guān)Qt Quick 3D的任何更新以來(lái)已經(jīng)有一段時(shí)間了,但是不是因?yàn)闆](méi)有任何進(jìn)展。實(shí)際上,情況恰恰相反:Qt團(tuán)隊(duì)一直忙于為Qt Quick 3D做好6.0版的準(zhǔn)備工作,所以沒(méi)有時(shí)間談?wù)撎砑拥乃泻芸岬男鹿δ?。因此,今天談?wù)劦侥壳盀橹筈t已完成的功能
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
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組件集】
Qt Quick 3D可以在任意地方渲染
Qt 6版本最大的開(kāi)發(fā)工作是將渲染引擎移植到Qt Rendering硬件接口上,這種努力將是非常值得的,因?yàn)楝F(xiàn)在可以使用Qt Quick和Qt Quick 3D與每個(gè)平臺(tái)的最佳圖形API。支持的圖形API列表是
這意味著無(wú)論你選擇使用什么平臺(tái)和圖形API組合,Qt Quick 3D都能按照預(yù)期工作,而不需要你需要了解每個(gè)圖形API的工作細(xì)節(jié)。任何需要圖形API特定知識(shí)的地方,例如涉及到坐標(biāo)系統(tǒng)時(shí),我們只需要使用OpenGL語(yǔ)義,并為你透明地將它們翻譯成原生API到應(yīng)用程序中。在過(guò)去的幾年里,隨著圖形API的進(jìn)一步分化,圖形開(kāi)發(fā)可能會(huì)變得更加困難,但有了Qt Quick和Qt Quick 3D,這一點(diǎn)你就不需要擔(dān)心了。
在3D場(chǎng)景中更深入地集成2D內(nèi)容
在早期版本的Qt Quick 3D中,必須將所有2D內(nèi)容渲染到屏幕外的表面(例如紋理),然后才能在3D中使用。這項(xiàng)工作非常類(lèi)似于Layers在Qt Quick中的工作方式。在Qt 6中,現(xiàn)在可以將2D Qt Quick Items直接渲染到3D場(chǎng)景中。因此,如果您曾經(jīng)因?yàn)镼t Quick場(chǎng)景中缺少透視轉(zhuǎn)換而感到沮喪,那么現(xiàn)在就有無(wú)限可能。
import QtQuick import QtQuick3D Window { visible: true width: 640 height: 480 title: qsTr("2D in 3D") color: "black" View3D { anchors.fill: parent PerspectiveCamera { z: 200 } DirectionalLight { } Model { source: "#Cube" materials: DefaultMaterial {} eulerRotation.y: 20 Node { // Empty spatial Node to give 2D item // a position in 3D space y: 100 Text { // 2D content in 3D anchors.centerIn: parent text: "Cube Label" color: "white" } } } } }
在上面的示例中,Text組件是一個(gè)2D項(xiàng),它是3D Cube的子項(xiàng),如果要移動(dòng)該模型,則2D項(xiàng)的位置將與模型綁定。
如果你想把Qt Quick的內(nèi)容渲染成一個(gè)紋理,那還是可以的。 一個(gè)例子是
import QtQuick import QtQuick3D Window { visible: true width: 640 height: 480 View3D { anchors.fill: parent PerspectiveCamera { z: 200 } DirectionalLight { } Texture { id: dynamicQMLTexture sourceItem: Rectangle { width: 256 height: 256 color: "pink" Text { anchors.centerIn: parent text: "Dynamic Texture!" color: "white" font.pointSize: 24 } } } Model { source: "#Cube" eulerRotation.y: 20 materials: DefaultMaterial { diffuseMap: dynamicQMLTexture } } } }
在上面的例子中,Texture組件的內(nèi)容來(lái)自于任何Qt Quick Component設(shè)置的sourceItem屬性。這就在內(nèi)部將該組件層次結(jié)構(gòu)渲染成一個(gè)QSGTexture,它可以在3D渲染器中用于紋理數(shù)據(jù),在本例中,它被映射為立方體模型。
改進(jìn)的glTF2支持
Qt Quick 3D在glTF2內(nèi)容上確實(shí)可以很好地工作,現(xiàn)在它比以往任何時(shí)候都更好。在6.0版本中,我們嘗試支持盡可能多的基本glTF2規(guī)范。最大的改進(jìn)領(lǐng)域之一是支持glTF2資產(chǎn)的動(dòng)畫(huà)功能。現(xiàn)在可以導(dǎo)入包含綁定動(dòng)畫(huà)的內(nèi)容。
為了實(shí)現(xiàn)更有效的動(dòng)畫(huà)支持,我們所做的其他改進(jìn)之一是在QtQuickTimeline中添加了對(duì)二進(jìn)制關(guān)鍵幀的支持。這意味著具有復(fù)雜動(dòng)畫(huà)的組件不需要由數(shù)千行QML表示。
glTF2 Morph動(dòng)畫(huà)是6.0發(fā)行版中明顯缺少的一件事。這項(xiàng)工作尚在進(jìn)行中,但很遺憾,未能及時(shí)完成6.0版的發(fā)布。您可以在不久的將來(lái)發(fā)布此功能。
除了動(dòng)畫(huà)工作之外,最新版本還付出了很多努力來(lái)確保以與3D內(nèi)容創(chuàng)建工具中相同的方式渲染導(dǎo)入的glTF2資產(chǎn)。目的是為glTF和盡可能多的擴(kuò)展提供100%的支持,因此向前邁進(jìn)期望在此領(lǐng)域有更多的改進(jìn)。
重新設(shè)計(jì)的自定義材料和后處理效果系統(tǒng)。
我們不得不對(duì)Qt 5版Qt Quick 3D做出的妥協(xié)之一是如何定義自定義材質(zhì)和后期處理效果。這個(gè)系統(tǒng)與 Qt 3D Studio 中的系統(tǒng)基本相同,但不幸的是,它很難使用,并在渲染引擎中創(chuàng)造了很多復(fù)雜性。隨著Qt 6和對(duì)渲染硬件接口的移植,我們認(rèn)真審視了這些系統(tǒng),并決定我們可以做得更好。
自定義材料
自定義材質(zhì)的目的是為用戶提供一種方法來(lái)定義他們自己的材質(zhì),以便在場(chǎng)景中對(duì)模型進(jìn)行著色。這在傳統(tǒng)上意味著編寫(xiě)著色器代碼。在Qt Quick中,我們提供了一個(gè)名為ShaderEffect的API,它為用戶提供了一種將著色器效果應(yīng)用到2D項(xiàng)目的方法,以及一種將QML屬性綁定為著色器制服的強(qiáng)大方法。我們想做的是為3D材質(zhì)提供同樣的API,但與2D不同的是,在編寫(xiě)shader代碼時(shí)需要考慮更多的狀態(tài)。比如3D物品需要注意光照、陰影和混合等問(wèn)題。 渲染一個(gè)2D項(xiàng)目的著色器只需要工作關(guān)于源紋理作為輸入,所以著色器可以相當(dāng)自如,但在3D中除非編寫(xiě)非常簡(jiǎn)單的材質(zhì),否則不可能只編寫(xiě)渲染所需的所有著色器代碼。這意味著對(duì)于大多數(shù)用戶來(lái)說(shuō),創(chuàng)建自己的材質(zhì)可能太困難了。
這就是為什么我們決定為定義材質(zhì)創(chuàng)建更多的框架。在這里查看新的自定義材質(zhì)API細(xì)節(jié)。
后期處理效果
后期處理效果API與之前版本中的方式相當(dāng)相似,但已經(jīng)更新為遵循新的CustomMaterial API的模式。后處理效果從本質(zhì)上來(lái)說(shuō)已經(jīng)和ShaderEffect相當(dāng)相似,大部分狀態(tài)是有一個(gè)輸入紋理和一個(gè)輸出紋理。然而它并不是完全一樣的,這樣的方式我們可以直接使用ShaderEffect API,因?yàn)槌祟伾y理,在3D中,你還將獲得一個(gè)有意義的深度緩沖區(qū)。 也有可能,與ShaderEffect不同,你需要執(zhí)行多次傳遞來(lái)實(shí)現(xiàn)所需的效果,所以后處理效果API實(shí)現(xiàn)了這一點(diǎn)。在這里查看后處理效果API的詳細(xì)信息。
Custom Material和Post-Processing Effect API非常強(qiáng)大,可以實(shí)現(xiàn)很多有趣的用例,在這里真的無(wú)法徹底描述,所以期待不久后有另一篇博文專(zhuān)門(mén)介紹這些功能。
感謝您的閱讀,希望這篇文章能帶給你一定的幫助!如果這篇文章沒(méi)能滿足你的需求、點(diǎn)擊獲取更多文章教程!現(xiàn)在立刻下載Qt6免費(fèi)試用吧!更多Qt類(lèi)開(kāi)發(fā)工具QtitanRibbon、QtitanChart、QtitanNavigation、QtitanDocking、QtitanDataGrid在線訂購(gòu)現(xiàn)直降1000元,歡迎咨詢(xún)慧都獲取更多優(yōu)惠>>
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: