翻譯|使用教程|編輯:龔雪|2024-05-24 15:58:42.853|閱讀 148 次
概述:本文將為大家介紹如何使用Qt Widget小部件如何實(shí)現(xiàn)一個(gè)簡單的RHI小部件示例,歡迎下載最新版組件體驗(yàn)~
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
Qt 是目前最先進(jìn)、最完整的跨平臺(tái)C++開發(fā)工具。它不僅完全實(shí)現(xiàn)了一次編寫,所有平臺(tái)無差別運(yùn)行,更提供了幾乎所有開發(fā)過程中需要用到的工具。如今,Qt已被運(yùn)用于超過70個(gè)行業(yè)、數(shù)千家企業(yè),支持?jǐn)?shù)百萬設(shè)備及應(yīng)用。
本文將為大家演示如何使用QRhi、Qt的3D API和著色語言抽象層渲染三角形。
Qt技術(shù)交流群:166830288 歡迎一起進(jìn)群討論
 
 
在很多方面,這個(gè)示例都是世界中的RHI窗口示例的對應(yīng)。這個(gè)應(yīng)用程序中的子類使用帶有基本頂點(diǎn)和片段著色器的簡單圖形管道渲染單個(gè)三角形。與普通的基于的應(yīng)用程序不同,本示例不需要擔(dān)心較低級別的細(xì)節(jié),比如設(shè)置窗口和QRhi,或者處理交換鏈和窗口事件,因?yàn)檫@些都由這里的QWidget框架負(fù)責(zé)。QRhiWidget子類的實(shí)例被添加到中,為了使示例保持最小和緊湊,沒有引入更多的小部件或3D內(nèi)容。
一旦將ExampleRhiWidget (QRhiWidget的子類)的實(shí)例添加到頂級小部件的子層次結(jié)構(gòu)中,相應(yīng)的窗口就會(huì)自動(dòng)變成Direct 3D、Vulkan、Metal或opengl渲染窗口。渲染的小部件內(nèi)容,即不是QRhiWidget、或的所有內(nèi)容,然后上傳到紋理,而提到的特殊小部件每個(gè)渲染到紋理,生成的紋理集由頂級小部件的backingstore組合在一起。
main()函數(shù)非常簡單,頂級小部件的默認(rèn)大小為720p(此大小以邏輯單位表示),實(shí)際像素大小可能不同,具體取決于比例因子。窗口可調(diào)整大小,QRhiWidget使實(shí)現(xiàn)正確處理由于窗口大小或布局變化而調(diào)整小部件大小的子類變得簡單。
int main(int argc, char **argv)
{
QApplication app(argc, argv);
ExampleRhiWidget *rhiWidget = new ExampleRhiWidget;
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(rhiWidget);
QWidget w;
w.setLayout(layout);
w.resize(1280, 720);
w.show();
return app.exec();
}
QRhiWidget子類重新實(shí)現(xiàn)了兩個(gè)虛擬對象:()和(),initialize()在render()之前至少被調(diào)用一次,但是在一些重要的變化時(shí)也會(huì)被調(diào)用,比如當(dāng)小部件的背景紋理由于小部件大小的變化而被重新創(chuàng)建時(shí),當(dāng)呈現(xiàn)目標(biāo)參數(shù)發(fā)生變化時(shí),或者當(dāng)小部件由于移動(dòng)到新的頂級窗口而被更改為新的時(shí)。
注意:與遺留的initializeGL - resizeGL - paintGL模型不同,QRhiWidget中只有兩個(gè)虛擬值。這是因?yàn)橛懈嗟奶厥馐录赡苄枰疹櫍粌H僅是調(diào)整大小。例如,當(dāng)重新父級到不同的頂層窗口時(shí)。(健壯的QOpenGLWidget實(shí)現(xiàn)必須通過執(zhí)行額外的簿記來處理這個(gè)問題,例如通過跟蹤相關(guān)的生命周期,這意味著三個(gè)虛擬對象實(shí)際上是不夠的)一個(gè)更簡單的initialize - render,在重要的更改時(shí)重新調(diào)用initialize更適合這個(gè)。
QRhi實(shí)例不屬于小部件,它將在initialize()中從基類中查詢,將其存儲(chǔ)為成員允許在再次調(diào)用initialize()時(shí)識(shí)別更改。圖形資源,比如頂點(diǎn)和統(tǒng)一緩沖區(qū),或者圖形管道,都在ExampleRhiWidget的控制之下。
#include <QRhiWidget>
#include <rhi/qrhi.h>
class ExampleRhiWidget : public QRhiWidget
{
public:
ExampleRhiWidget(QWidget *parent = nullptr) : QRhiWidget(parent) { }
void initialize(QRhiCommandBuffer *cb) override;
void render(QRhiCommandBuffer *cb) override;
private:
QRhi *m_rhi = nullptr;
std::unique_ptr<QRhiBuffer> m_vbuf;
std::unique_ptr<QRhiBuffer> m_ubuf;
std::unique_ptr<QRhiShaderResourceBindings> m_srb;
std::unique_ptr<QRhiGraphicsPipeline> m_pipeline;
QMatrix4x4 m_viewProjection;
float m_rotation = 0.0f;
};
要使#include <rhi/qrhi.h>語句起作用,應(yīng)用程序必須鏈接到GuiPrivate(或使用qmake鏈接到gui-private)。
CMakeLists.txt
target_link_libraries(simplerhiwidget PRIVATE Qt6::Core Qt6::Gui Qt6::GuiPrivate Qt6::Widgets )
未完待續(xù),下期接著講......
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自:慧都網(wǎng)