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),無論視窗位置如何。