OpenGL教程翻譯 第一課 Create a window
原文地址:http://ogldev.atspace.co.uk/(源碼請從原文主頁下載)
Background
Opengl標準沒有指定任何API爲了建立和使用窗口。在x系統中提供opengl的接口爲GLX。Windows提供WGL而MacOS提供CGL。爲了建立一個能夠顯示圖像的窗口,我們直接使用這些接口,這樣可以不用關心在不同操作系統中具體實現的細節。我們這裏使用的庫叫'OpenGL utility library' 簡稱GLUT. 它爲窗口的管理、事件處理、IO控制和一些其他的設備管理提供了一個簡單的API。此外,GLUT是跨平臺的,這使移植更方便。SDL和GLFW可代替GLUT。
Source walkthrough
glutInit(&argc,argv);
這個函數是爲了初始化GLUT。裏面的參數可以直接從命令行中得到,同時可以包含其他有用的選項比如
'-sync' 和 '-gldebug',這樣可以自動的檢查GL的錯誤和獨立的顯示它們。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
現在我們學習設置一些GLUT的參數,GLUT_DOUBLE設置雙緩衝(double buffering,即當一個buffer顯示的時候,另一個buffer用來繪製)和color buffer,後者是大多數渲染結束的地方(比如屏幕)。後面章節中我們經常用到這兩個和其他的參數。
glutInitWindowSize(1024,768);
glutInitWindowPosition(100,100);
glutCreateWindow("Tutorial01");
這些函數設置了窗口的參數並創建窗口。你也可以選擇指定窗口的標題。
glutDisplayFunc(RenderSceneCB);
因爲我們工作在一個窗口系統中,可以通過事件回調函數和運行中的項目進行交互。GLUT和基本的窗口系統進行交互,並且提供給我們一些回調函數。在這裏我們僅僅使用了一個主回調函數,這個主回調函數完成了一幀中的所有渲染工作。這個函數被GLUT內部循環不斷的調用。
glClearColor(0.0f,0.0f, 0.0f, 0.0f);
在OpenGL中,這是我們第一次遇到‘state’這個概念。提出‘state’的原因是:渲染是一個複雜的任務,不能夠像對待一個接受參數的函數命令(設計良好的函數不會有太多參數)一樣對待它。你需要去指定shaders、buffers和各種可以影響渲染過程的屬性。此外,你會經常需要讓幾個渲染操作有同樣的設置(比如,如果你從未禁用深度測試的功能,那就不用在每次渲染調用的時候去設置它)。這就是爲什麼“大部分渲染操作的配置是通過設置OpenGL狀態機內的屬性和參數值來完成,而渲染命令僅能使用跟繪製的頂點的個數和初始偏移量有關的個別參數”的原因。在調用一個狀態改變函數之後,這個狀態將保持不變直到用不同的參數值再次調用此函數。上面這個函數是用來設置清除幀緩存(後面介紹)時要用到的顏色。顏色有四個通道(RGBA),而且它被指定爲0.0
– 1.0之間標準化的值。
glutMainLoop();
這個函數調用將控制傳遞給GLUT,並且開啓了它自己內部的循環。在這個循環中,它監聽來自窗口系統的事件並通過我們設置的回調函數傳遞給GLUT。在本例子中,GLUT只調用我們定義用來顯示窗口的回調函數(RenderSceneCB),以使我們能渲染幀。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
第一個函數的功能僅僅就是清除幀緩存(使用我們在上面指定過的顏色)。第二個函數調用是爲了告訴GLUT 在backbuffer和frontbuffer之間進行交換。在通過幀回調函數的下一個循環中,我們將場景渲染到當前的frontbuffer中,而backbuffer將被顯示。