標籤:width att back 函數 bind 記憶體 沒有 body 視窗
本節將繪製一個三角形
先看最終代碼:
MyGlWindow.cpp:
1 #include <gl\glew.h> 2 #include "MyGlWindow.h" 3 4 void MyGlWindow::initializeGL() 5 { 6 glewInit(); 7 Glfloat verts[]= 8 { 9 +0.0f, +1.0f,10 -1.0f, -1.0f,11 +1.0f, -1.0f,12 };13 GLuint myBufferID;14 glGenBuffers(1, &myBufferID);15 glBindBuffer(GL_ARRAY_BUFFER, myBufferID);16 glBufferData(GL_ARRAY_BUFFER, sizeof(vertes), verts, GL_STATIC_DRAW);17 glEnableVertexAttribArray(0);18 glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,0,0);19 }20 21 void MyGlWindow::paintGL()22 {23 glViewport(0,0,width(),height());24 glDrawArrays(GL_TRIANGLES, 0, 3); 25 }
啟用通道
每個頂點都有多種attributes,例如位置,顏色等。
為了讓把資料從記憶體發送到顯卡中,我們需要告訴OpenGL去開啟某個attribute。
17 行使用glEnableVertexAttribArray()函數來啟用位置屬性,參數0表示預設的資料通道,位置。
資料描述
我們接著需要對資料進行描述,告訴OpenGL這串資料代表幾個頂點,每個頂點是幾個資料群組成。18行使用glVertexAttribPointer()函數達到這個目的。
第一個參數和前一行的函數參數表示同樣的意思,位置0,位置通道。
第二個參數表示每個元素由幾個資料群組成,因為我們使用了2個資料來表示x和y,所以這裡是2。
第三個參數表示資料類型是GL_FLOAT
第四個參數表示是否對資料進行Normalize,這裡不需要
第五個參數表示資料的Stride,即兩組資料間的跨度,有時不只有表示位置的資料,還有表示顏色等其他資訊的資料,那麼兩組同類型資料之間就有一些跨度。
第六個參數表示起始的位移,和第五個參數結合使用。
繪製
24 行使用glDrawArrays對數組進行繪製。
第一個參數表示繪製的圖元類型,這裡是三角形。
第二個參數表示第一個頂點的起始位置。
第三個參數表示繪製幾個頂點。
視窗自適應
OpenGL視窗沒有根據Qt視窗大小動態調整,所以添加第23 行來進行調整。
glViewPort()函數用來指定用視窗的哪個地區進行OpenGL繪製,四個參數分別表示左上方x,左上方y,繪製寬度,繪製高度。
這裡的width()和height()是Qt的函數。
3D Computer Grapihcs Using OpenGL - 04 First Triangle