Qt Quick 3D6.0:更深入集成2D內容,跨平臺渲染不是夢

Qt是一個跨平臺框架,通常用作圖形工具包,它不僅創建CLI應用程序中非常有用。而且它也可以在三種主要的臺式機操作系統以及移動操作系統(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式設備,Android(Necessitas)和iOS的端口上運行。現在我們爲你提供了免費的試用版。趕快點擊下載Qt最新試用版>>

Qtitan組件集

  • QtitanRibbon: 遵循Microsoft Ribbon UI Paradigm for Qt技術的Ribbon UI組件,致力於爲Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
  • QtitanChart : 是一個C ++庫,代表一組控件,這些控件使您可以快速地爲應用程序提供漂亮而豐富的圖表。並且支持所有主要的桌面操作系統。
  • QtitanDataGrid: 適用於Qt的商業化DataGrid 組件,使得表格數據可以直接面向終端用戶完全集成了QtDesigner,極易適應其他相似開發環境,保證100%兼容Qt GUI。

Qt Quick 3D可以在任意地方渲染

Qt 6版本最大的開發工作是將渲染引擎移植到Qt Rendering硬件接口上,這種努力將是非常值得的,因爲現在可以使用Qt Quick和Qt Quick 3D與每個平臺的最佳圖形API。支持的圖形API列表是

  • OpenGL (版本3及以上)
  • OpenGL ES (版本2及以上)
  • Vulkan (1.0及以上)
  • Metal

這意味着無論你選擇使用什麼平臺和圖形API組合,Qt Quick 3D都能按照預期工作,而不需要你需要了解每個圖形API的工作細節。任何需要圖形API特定知識的地方,例如涉及到座標系統時,我們只需要使用OpenGL語義,併爲你透明地將它們翻譯成原生API到應用程序中。在過去的幾年裏,隨着圖形API的進一步分化,圖形開發可能會變得更加困難,但有了Qt Quick和Qt Quick 3D,這一點你就不需要擔心了。

在3D場景中更深入地集成2D內容

在早期版本的Qt Quick 3D中,必須將所有2D內容渲染到屏幕外的表面(例如紋理),然後才能在3D中使用。這項工作非常類似於Layers在Qt Quick中的工作方式。在Qt 6中,現在可以將2D Qt Quick Items直接渲染到3D場景中。因此,如果您曾經因爲Qt Quick場景中缺少透視轉換而感到沮喪,那麼現在就有無限可能。

除了爲3D中的2D項目提供更直接,更有效的渲染路徑外,將2D內容集成到場景中也比以往更加容易。這是一個示例,演示將2D內容集成到3D場景中:

 

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組件是一個2D項,它是3D Cube的子項,如果要移動該模型,則2D項的位置將與模型綁定。

如果你想把Qt Quick的內容渲染成一個紋理,那還是可以的。 一個例子是

 

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組件的內容來自於任何Qt Quick Component設置的sourceItem屬性。這就在內部將該組件層次結構渲染成一個QSGTexture,它可以在3D渲染器中用於紋理數據,在本例中,它被映射爲立方體模型。

改進的glTF2支持

Qt Quick 3D在glTF2內容上確實可以很好地工作,現在它比以往任何時候都更好。在6.0版本中,我們嘗試支持儘可能多的基本glTF2規範。最大的改進領域之一是支持glTF2資產的動畫功能。現在可以導入包含綁定動畫的內容。

 

爲了實現更有效的動畫支持,我們所做的其他改進之一是在QtQuickTimeline中添加了對二進制關鍵幀的支持。這意味着具有複雜動畫的組件不需要由數千行QML表示。


glTF2 Morph動畫是6.0發行版中明顯缺少的一件事。這項工作尚在進行中,但很遺憾,未能及時完成6.0版的發佈。您可以在不久的將來發布此功能。

除了動畫工作之外,最新版本還付出了很多努力來確保以與3D內容創建工具中相同的方式渲染導入的glTF2資產。目的是爲glTF和儘可能多的擴展提供100%的支持,因此向前邁進期望在此領域有更多的改進。

重新設計的自定義材料和後處理效果系統。

我們不得不對Qt 5版Qt Quick 3D做出的妥協之一是如何定義自定義材質和後期處理效果。這個系統與 Qt 3D Studio 中的系統基本相同,但不幸的是,它很難使用,並在渲染引擎中創造了很多複雜性。隨着Qt 6和對渲染硬件接口的移植,我們認真審視了這些系統,並決定我們可以做得更好。

自定義材料

自定義材質的目的是爲用戶提供一種方法來定義他們自己的材質,以便在場景中對模型進行着色。這在傳統上意味着編寫着色器代碼。在Qt Quick中,我們提供了一個名爲ShaderEffect的API,它爲用戶提供了一種將着色器效果應用到2D項目的方法,以及一種將QML屬性綁定爲着色器制服的強大方法。我們想做的是爲3D材質提供同樣的API,但與2D不同的是,在編寫shader代碼時需要考慮更多的狀態。比如3D物品需要注意光照、陰影和混合等問題。 渲染一個2D項目的着色器只需要工作關於源紋理作爲輸入,所以着色器可以相當自如,但在3D中除非編寫非常簡單的材質,否則不可能只編寫渲染所需的所有着色器代碼。這意味着對於大多數用戶來說,創建自己的材質可能太困難了。

這就是爲什麼我們決定爲定義材質創建更多的框架。在這裏查看新的自定義材質API細節。

後期處理效果

後期處理效果API與之前版本中的方式相當相似,但已經更新爲遵循新的CustomMaterial API的模式。後處理效果從本質上來說已經和ShaderEffect相當相似,大部分狀態是有一個輸入紋理和一個輸出紋理。然而它並不是完全一樣的,這樣的方式我們可以直接使用ShaderEffect API,因爲除了顏色紋理,在3D中,你還將獲得一個有意義的深度緩衝區。 也有可能,與ShaderEffect不同,你需要執行多次傳遞來實現所需的效果,所以後處理效果API實現了這一點。在這裏查看後處理效果API的詳細信息。

Custom Material和Post-Processing Effect API非常強大,可以實現很多有趣的用例,在這裏真的無法徹底描述,所以期待不久後有另一篇博文專門介紹這些功能。

感謝您的閱讀,希望這篇文章能帶給你一定的幫助!