Qt實現 QOpenGL繪製彩色三角形

2021-10-14 22:54:44 字數 4676 閱讀 7243

目錄

1、qopengl介紹

2、效果

3、主要**介紹:

4、全部**:

qopenglwidget類封裝了opengl,比起原生的opengl,使用起來很方便。只需要讓子類繼承qopenglwidget。

opengl(英語:open graphics library,譯名:開放圖形庫或者「開放式圖形庫」)是用於渲染

2d、3d

向量圖形的跨語言、跨平台的應用程式程式設計介面(api)。這個介面由近350個不同的函式呼叫組成,用來從簡單的圖形位元繪製複雜的三維景象。而另一種程式介面系統是僅用於microsoft windows上的direct3d。opengl常用於cad、虛擬實境、科學視覺化程式和電子遊戲開發。(摘自維基百科)

其實opengl是把影象資料和幾何資料傳送給電腦顯示卡,進行一系列處理後,把圖形顯示到螢幕上進行展示。

qopenglwidget允許在平台支援的情況下使用不同的opengl版本和配置檔案,只需通過setformat()設定請求的格式即可。

可以根據自己電腦所支援的opengl版本進行相容性設定。

qsu***ceformat format;

format.setdepthbuffersize(24);

format.setstencilbuffersize(8);

format.setversion(3, 2);

format.setprofile(qsu***ceformat::coreprofile);

this->setformat(format);

qopenglwidget還提供了三個函式來方便我們處理業務。分別是

paintgl():繪製渲染opengl場景,update的時候會自動呼叫

resizegl() :設定opengl的大小,resize的時候呼叫

initializegl() :提供初始化opengl需要的環境的介面,在resizegl或者paintgl之前會被呼叫一次。

1、著色器裝載

void myqopengl::initshader()

\n";

vshader->compilesourcecode(vsrc);

//片段著色器

qopenglshader *fshader = new qopenglshader(qopenglshader::fragment, this);

const char *fsrc =

"in vec4 color; \n"

"out vec4 fcolor; \n"

"void main() \n";

fshader->compilesourcecode(fsrc);

//著色器程式

_pshaderprogram = new qopenglshaderprogram;

_pshaderprogram->addshader(vshader);

_pshaderprogram->addshader(fshader);

_pshaderprogram->link();

_pshaderprogram->bind();

}

這裡我們需要建立乙個頂點著色器和片段著色器,然後通過addshader裝載它們,所謂著色器就是畫素被渲染時執行的程式,在gpu中執行的程式。const char *vsrc字串是opengl著色器語言(opengl shading language)即glsl。通過這些語言來描述給gpu。

而頂點就是我們圖形的幾個頂角,片段就是幾個頂點包圍起來的全部畫素點,通過對以上進行渲染,就能得到我們需要的圖形和顏色。

2、頂點描述

下面描述的是三角形的三個頂點

//頂點位置

glfloat vertices = ;

如下圖所示:

3、頂點顏色

對三個頂點進行顏色的描述,分別表示r、g、b,我們知道,通過r、g、b的組合可以組合出任何我們想要的顏色

glfloat colors = ;
4、qopenglbuffer _vbo用於管理opengl的快取物件,流程是create()建立快取物件--bind()繫結物件關聯的快取到opengl環境

--allocate()分配快取空間--setattributebuffer()填充資料。

_vbo.create();

_vbo.bind();

_vbo.allocate(vertices, 18*sizeof(glfloat));

gluint vposition = _pshaderprogram->attributelocation("vposition");

_pshaderprogram->setattributebuffer(vposition, gl_float, 0, 2, 0);

glenablevertexattribarray(vposition);

標頭檔案:

#ifndef myqopengl_h

#define myqopengl_h

#include #include #include #include class myqopengl : public qopenglwidget, protected qopenglfunctions

;#endif // myqopengl_h

cpp

#include "myqopengl.h"

#include myqopengl::myqopengl(qwidget *parent)

: qopenglwidget(parent)

void myqopengl::initializegl()

void myqopengl::initshader()

\n";

vshader->compilesourcecode(vsrc);

//片段著色器

qopenglshader *fshader = new qopenglshader(qopenglshader::fragment, this);

const char *fsrc =

"in vec4 color; \n"

"out vec4 fcolor; \n"

"void main() \n";

fshader->compilesourcecode(fsrc);

//著色器程式

_pshaderprogram = new qopenglshaderprogram;

_pshaderprogram->addshader(vshader);

_pshaderprogram->addshader(fshader);

_pshaderprogram->link();

_pshaderprogram->bind();

}void myqopengl::resizegl(int w, int h)

void myqopengl::paintgl()

; _vbo.create();

_vbo.bind();

_vbo.allocate(vertices, 18*sizeof(glfloat));

gluint vposition = _pshaderprogram->attributelocation("vposition");

_pshaderprogram->setattributebuffer(vposition, gl_float, 0, 2, 0);

glenablevertexattribarray(vposition);

// 頂點顏色

glfloat colors = ;

_vbo.write(6*sizeof(glfloat), colors, 12*sizeof(glfloat));

gluint vcolor = _pshaderprogram->attributelocation("vcolor");

_pshaderprogram->setattributebuffer(vcolor, gl_float, 6*sizeof(glfloat), 3, 0);

glenablevertexattribarray(vcolor);

// 繪製

gldrawarrays(gl_********s, 0, 3);

}

通過以上**實現qopengl繪製了乙個橘色的三角形,具體的api這裡不進行過多討論,主要是熟悉opengl的繪圖流程,後面再專門對相關的介面進行**,以上。

彩色蟒蛇python Python繪製彩色蟒蛇

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 一開始在練習的時候,在網上看了一些例項,看到有乙個簡單的例子,就是蟒蛇的例子,大家也知道python這個中文翻譯過來就是蟒蛇的意思,接著我有借用了這個例項自己弄了乙個不一樣的蟒蛇,轉圈圈的蛇 先來解析一下 turtle.setup 1300,800,0,...

python繪製彩色花 AI繪製非常漂亮的彩色花朵

這篇教程像指令碼之家的朋友們介紹用ai繪製漂亮花朵的方法。ai的強大功能支援,讓我們在做許多任務作時事半功倍。關鍵看大家是否想到這樣的方法!希望這篇教程能啟發大家的思路!我們先來看看最終的效果圖 1開啟ai,新建。用鋼筆畫個弧,對稱複製,連線兩個定點 物件 路徑 連線 葉子完成 2.複製一片葉子,旋...

QT文字繪製

1 基本繪製 qpainter painter this 這個this要斟酌下 painter.drawtext 100,100,yafeilinux 2 中級繪製 qpainter painter this qrectf ff 100,100,300,200 設定乙個矩形 painter.draw...