OpenGL中一個對象是指一些選項的集合,它代表OpenGL狀態的一個子集。比如,我們可以用一個對象來代表繪圖窗口的設置,之后我們就可以設置它的大小、支持的顏色位數等等。可以把對象看做一個C風格的結構體(Struct):
struct object_name {float option1;int option2;char[] name;
};
使用一個對象時,通常看起來像如下一樣(把OpenGL上下文看作一個大的結構體):
// OpenGL的狀態
struct OpenGL_Context {...object* object_Window_Target;...
};
// 創建對象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 綁定對象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 設置當前綁定到 GL_WINDOW_TARGET 的對象的一些選項
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 將上下文對象設回默認
glBindObject(GL_WINDOW_TARGET, 0);
這一小段代碼展現了你以后使用OpenGL時常見的工作流。我們首先創建一個對象,然后用一個id保存它的引用(實際數據被儲存在后臺)。然后我們將對象綁定至上下文的目標位置(例子中窗口對象目標的位置被定義成GL_WINDOW_TARGET)。接下來我們設置窗口的選項。最后我們將目標位置的對象id設回0,解綁這個對象。設置的選項將被保存在objectId所引用的對象中,一旦我們重新綁定這個對象到GL_WINDOW_TARGET位置,這些選項就會重新生效。
必須告訴OpenGL渲染窗口的尺寸大小,即視口(Viewport),這樣OpenGL才只能知道怎樣根據窗口大小顯示數據和坐標。我們可以通過調用glViewport函數來設置窗口的維度(Dimension):
glViewport(0, 0, 800, 600);
glViewport函數前兩個參數控制窗口左下角的位置。第三個和第四個參數控制渲染窗口的寬度和高度(像素)。
添加一個while循環,我們可以把它稱之為渲染循環(Render Loop),它能在我們讓GLFW退出前一直保持運行。下面幾行的代碼就實現了一個簡單的渲染循環:
while(!glfwWindowShouldClose(window))
{glfwSwapBuffers(window);glfwPollEvents();
}
glfwWindowShouldClose函數在我們每次循環的開始前檢查一次GLFW是否被要求退出,如果是的話該函數返回true然后渲染循環便結束了,之后為我們就可以關閉應用程序了。
glfwPollEvents函數檢查有沒有觸發什么事件(比如鍵盤輸入、鼠標移動等)、更新窗口狀態,并調用對應的回調函數(可以通過回調方法手動設置)。
glfwSwapBuffers函數會交換顏色緩沖(它是一個儲存著GLFW窗口每一個像素顏色值的大緩沖),它在這一迭代中被用來繪制,并且將會作為輸出顯示在屏幕上。
雙緩沖(Double Buffer): 前緩沖保存著最終輸出的圖像,它會在屏幕上顯示;而所有的的渲染指令都會在后緩沖上繪制。當所有的渲染指令執行完畢后,我們交換(Swap)前緩沖和后緩沖,這樣圖像就立即呈顯出來,之前提到的不真實感就消除了。當渲染循環結束后我們需要正確釋放/刪除之前的分配的所有資源
glfwTerminate();
return 0;
使用GLFW的glfwGetKey函數,它需要一個窗口以及一個按鍵作為輸入。這個函數將會返回這個按鍵是否正在被按下。我們將創建一個processInput函數來讓所有的輸入代碼保持整潔。
void processInput(GLFWwindow *window)
{if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}
這里我們檢查用戶是否按下了返回鍵(Esc)(如果沒有按下,glfwGetKey將會返回GLFW_RELEASE。如果用戶的確按下了返回鍵,我們將通過glfwSetwindowShouldClose使用把WindowShouldClose屬性設置為 true的方法關閉GLFW。下一次while循環的條件檢測將會失敗,程序將會關閉。
我們接下來在渲染循環的每一個迭代中調用processInput:
while (!glfwWindowShouldClose(window))
{processInput(window);glfwSwapBuffers(window);glfwPollEvents();
}
這就給我們一個非常簡單的方式來檢測特定的鍵是否被按下,并在每一幀做出處理。
通過調用glClear函數來清空屏幕的顏色緩沖,它接受一個緩沖位(Buffer Bit)來指定要清空的緩沖,可能的緩沖位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。[在每個新的渲染迭代開始的時候我們總是希望清屏,否則我們仍能看見上一次迭代的渲染結果。]
把所有的渲染(Rendering)操作放到渲染循環中:
// 渲染循環
while(!glfwWindowShouldClose(window))
{// 輸入processInput(window);// 渲染指令...// 檢查并調用事件,交換緩沖glfwPollEvents();glfwSwapBuffers(window);
}
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);
除了glClear之外,我們還調用了glClearColor來設置清空屏幕所用的顏色。當調用glClear函數,清除顏色緩沖之后,整個顏色緩沖都會被填充為glClearColor里所設置的顏色。在這里,我們將屏幕設置為了類似黑板的深藍綠色。
glClearColor函數是一個狀態設置函數,而glClear函數則是一個狀態使用的函數,它使用了當前的狀態來獲取應該清除為的顏色。
渲染類型:(圖元)GL_POINTS、GL_TRIANGLES、GL_LINE_STRIP。顏色每個分量的強度設置在0.0到1.0之間:
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
四個分量分別是他們的RGB值和Alpha值。
2019年10月2日——艾孜爾江筆記
總結
以上是生活随笔為你收集整理的基于GLFW的OpenGL学习001_艾孜尔江笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。