title: OpenGL(2)視窗
date: 2020-06-28 10:07
category: 圖形學
tags: opengl
連結:OpenGL(2)視窗
1. 視口
在開始渲染之前有一件重要的事情要做,就是告訴OpenGL渲染視窗的尺寸大小,即視口(Viewport).
這樣OpenGL才能知道怎樣根據視窗大小來顯示資料和坐标,通過glViewPort函數來設定視窗的次元
glViewPort函數前兩個參數控制視窗左下角的位置,第三個和第四個參數控制渲染視窗的寬度和高度(像素)。
OpenGL使用glViewport中定義的位置和寬高進行2D坐标的轉換,将OpenGL中的位置坐标轉換為螢幕坐标,假如OpenGL中的坐标(-0.5,0.5)被映射為螢幕中的坐标(200,450),處理過的OpenGL坐标範圍隻為-1到1,事實上就是将(-1,1)範圍内的坐标映射到(0,800)和(0,600)
2. 渲染
2.1 渲染循環(Render Loop)
如果不希望隻繪制一個圖像之後,應用程式就立即退出并關閉視窗,希望在主動關閉它之前不斷的繪制圖像,并能接受使用者輸入,需要在程式中添加一個while循環,讓視窗在退出前一直保持運作。
while(!glfwWindowShouldClose(window)){
glfwSwapBuffers(windo);
glfwPollEvents();
}
- glfwWindowShouldClose:每次循環的開始前檢查一次GLFW是否被要求退出,如果是函數傳回true,然後渲染循環結束,之後關閉應用程式。
- glfwSwapBuffers:交換顔色緩沖,用來繪制,并且作為輸出顯示到螢幕上
- glfwPollEvents:檢查觸發什麼事件、更新視窗狀态,并調用對應的回調函數。
2.2 流程
将所有的渲染操作放在渲染循環中,讓渲染指令在每次渲染循環疊代中都能被執行。
while(!glfwWindowShouldClose(window)){
//輸入
processInput(window);
//渲染指令
//檢查并調用事件,交換緩沖
glfwPollEvents();
glfwSwapBuffers(window);
}
設定清屏顔色以及清空顔色緩沖:為了加速渲染,避免看見上一次疊代的渲染結果;
glClear函數用來清空螢幕的顔色緩沖,接收一個緩沖位(Buffer bit)狀态使用函數
其中
GL_DEPTH_BUFFER_BIT: 深度緩沖
GL_STENCIL_BUFFER_BIT: 模闆緩沖
GL_COLOR_BUFFER_BIT: 顔色緩沖
glClearColor函數來設定清空螢幕所用的顔色,整個顔色緩沖都會被填充為glClearColor裡面所設定的顔色。狀态設定函數
glClearColor(0.3f,0.2f,0.3f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);