跳轉到內容

OpenGL 程式設計/基礎/矩形

來自華夏公益教科書,開放的書籍,開放的世界

繪製矩形

[編輯 | 編輯原始碼]

回顧上一章,我們介紹了 OpenGL/GLUT 應用程式的基本結構。

#ifndef WIN32 //if using windows then do windows specific stuff.
#define WIN32_LEAN_AND_MEAN //remove MFC overhead from windows.h which can cause slowness
#define WIN32_EXTRA_LEAN

#include <windows.h>
#endif

#include <GL/gl.h>
#include <GL/glut.h>
#include <GL/glu.h>
#include <conio.h>//needed for getch

void setup() { /* empty function  nothing to setup yet */ }
void display() { /* empty function   required as of glut 3.0 */ }

int main(int argc, char *argv[])
{
       glutInit(&argc, argv);
       glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
       glutInitWindowSize(800,600);
       glutCreateWindow("Hello World");

       setup();
       glutDisplayFunc(display);

       glutMainLoop();

       getch();//pause here to see results or lack there of
       return 0;
}

現在,我們將在 setup()display() 函式中新增一些內容,以便繪製一個矩形。

更改背景顏色

[編輯 | 編輯原始碼]

在 setup 函式中新增一行

void setup() {
       glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
}

使用這些引數呼叫 glClearColor() 將更改背景顏色為白色。暫時,我們將保留此行,不進行解釋。稍後我們將回到 1.0f 的含義。

準備繪製

[編輯 | 編輯原始碼]

為了讓我們能夠繪製,GLUT 需要在每次工作時清除螢幕。這透過兩個函式完成,一個在 display 函式的開頭,另一個在結尾。

void display() {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       /* drawing commands would go here, if we had any yet... */
       glutSwapBuffers();
}

透過使用 glClear(),我們獲得了一個乾淨的畫布來工作;之前緩衝區(儲存渲染影像的記憶體位置)中的所有內容都消失了。現在我們使用了一個新的緩衝區,所以在函式結束時,我們需要將該緩衝區切換到我們的視窗中。在 GLUT 中,這是透過呼叫 glutSwapBuffers() 來完成的。

如果你還不完全理解這兩個函式為什麼存在,請不要擔心。你會有時間學習的。

好的,現在可以繪製了嗎?

[編輯 | 編輯原始碼]

讓我們新增一個函式到 display,它將為我們提供一個簡單的矩形。

void display() {
       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
       glColor3f(0.0f, 0.0f, 0.0f);
       glRectf(-0.75f,0.75f, 0.75f, -0.75f);
       glutSwapBuffers();
}

再次忽略 glColor3f() 的引數。現在只需要相信我們,這將使我們的矩形變成黑色,以便我們可以在白色背景上看到它。然後,我們使用 glRectf() 函式實際繪製矩形。我們向 glRectf() 傳遞兩個引數集:要繪製的矩形的一個頂點的 x 和 y 座標,以及另一個相對頂點的 x 和 y 座標。需要注意的是,這些 x 和 y 座標不是用畫素表示的,而是用視口座標表示的。

你會注意到,如果你使用上面的 display 函式編譯並執行程式,然後調整視窗大小,你的矩形會隨著視窗的大小而增長和縮小。在這個例子中,矩形將佔用視窗寬度和高度的 75%。這是因為我們沒有設定視口。

視口定義瞭如何將使用浮點數的 OpenGL 空間中的座標對映到使用畫素的視窗空間。預設情況下,視口假設左上角為 (-1, 1),左下角為 (-1, -1),右上角為 (1, 1),右下角為 (1, -1),無論視窗位置如何

華夏公益教科書