1. 程式人生 > 其它 >opengl——建立一個視窗

opengl——建立一個視窗

技術標籤:openglopenglC++

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("Tutorial 01");

這些函式設定了視窗的引數(包括視窗大小、視窗位置以及視窗標題)並建立視窗。

glutDisplayFunc(RenderSceneCB);

因為我們工作在一個視窗系統中,可以通過事件回撥函式與執行中的專案進行互動。GLUT 可以和基本的視窗系統進行互動,並且提供給我們一些回撥函式。在這裡我們僅僅使用了一個主回撥函式,這個主回撥函式完成了一幀中的所有渲染工作。這個函式被 GLUT 內部迴圈不斷的呼叫。

glClearColor(0.0f,0.0f, 0.0f, 0.0f);

在 OpenGL 中,這是我們第一次遇到 ‘state’ 這個概念。提出 ‘state’ 的原因是:渲染是一個複雜的任務,不能夠像對待一個接受引數的函式命令(設計良好的函式不會有太多引數)一樣對待它。你需要去指定 shaders、buffers 和各種可以影響渲染過程的屬性。此外,你會經常需要讓幾個渲染操作有同樣的設定(比如,如果你從未禁用深度測試的功能,那就不用在每次渲染呼叫的時候去設定它)。這就是為什麼 “大部分渲染操作的配置是通過設定 OpenGL 狀態機內的屬性和引數值來完成,而渲染命令僅能使用跟繪製的頂點的個數和初始偏移量有關的個別引數” 的原因。在呼叫一個狀態改變函式之後(改變 OpenGL 的狀態),這個狀態將保持不變直到用不同的引數值再次呼叫此函式。上面這個函式是用來設定清除幀快取(後面介紹)時要用到的顏色。顏色有四個通道(RGBA),而且它被指定為 0.0 – 1.0 之間標準化的值。

glutMainLoop();

這個函式呼叫將控制傳遞給 GLUT,並且開啟了它自己內部的迴圈。在這個迴圈中,它監聽來自視窗系統的事件並通過我們設定的回撥函式傳遞給 GLUT。在本例子中,GLUT只調用我們定義用來顯示視窗的回撥函式(RenderSceneCB),以使我們能渲染幀。

glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();

第一個函式的功能僅僅就是清除幀快取(使用我們在上面指定過的顏色)。第二個函式呼叫是為了告訴 GLUT 在 backbufferfrontbuffer 之間進行交換。在通過幀回撥函式的下一個迴圈中,我們將場景渲染到當前的 frontbuffer 中,而 backbuffer 將被顯示。
在這裡插入圖片描述
學習內容來源:https://www.bootwiki.com/opengl/opengl-modern-opengl-tutorial.html