一.工程相關(guān)代碼如下:
// GLCreateWindow.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)沙绝。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
// GLFW
#include <GLFW/glfw3.h>
//GLWF 按鍵回調(diào)
void key_callback( GLFWwindow* window , int key,int scancode, int action, int mode );
int _tmain(int argc, _TCHAR* argv[])
{
//初始化GLFW
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR , 3); // 主版本號(hào)
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR , 3); // 次版本號(hào)
glfwWindowHint(GLFW_OPENGL_PROFILE , GLFW_OPENGL_CORE_PROFILE );
glfwWindowHint(GLFW_RESIZABLE , GL_FALSE ); // 窗口尺寸不可變
//創(chuàng)建窗口薄货,glfwCreateWindow前三個(gè)參數(shù)分別為 窗口寬和高保檐,以及標(biāo)題
GLFWwindow* window = glfwCreateWindow(800,600 , "LearnOpenGL" , nullptr , nullptr );
if( window == nullptr ){
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate(); // 銷毀窗口和資源
return -1;
}
glfwMakeContextCurrent( window ); //將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文
//初始化GLEW
glewExperimental = GL_TRUE; //可以使用更多現(xiàn)代化的技術(shù)
if( glewInit() != GLEW_OK ){
std::cout << "Failed to initialize GLEW" << std::endl;
return -1;
}
int width , height ;
glfwGetFramebufferSize( window , &width , &height ); //得到窗口大小
/* glViewport函數(shù)前兩個(gè)參數(shù)控制窗口左下角的位置月劈。第三個(gè)和第四個(gè)參數(shù)控制渲染窗口的寬度和高度(像素)
這里也可以把glViewport設(shè)置的比 glfw 的窗口小僧界。
*/
glViewport( 0 ,0 , width , height );
// 通過GLFW注冊(cè)我們的函數(shù)至合適的回調(diào)
glfwSetKeyCallback( window ,key_callback );
while ( ! glfwWindowShouldClose(window) )
{
glfwPollEvents(); // 檢查有沒有觸發(fā)什么事件
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); // 設(shè)置清空屏幕所用的顏色
glClear(GL_COLOR_BUFFER_BIT); // 清空屏幕
glfwSwapBuffers( window ); // 交換顏色緩沖
}
glfwTerminate(); //釋放/刪除之前的分配的所有資源
system("pause");
return 0;
}
/*
按鍵回調(diào)函數(shù)接受一個(gè)GLFWwindow指針作為它的第一個(gè)參數(shù)迅矛;
第二個(gè)整形參數(shù)用來表示按下的按鍵;
action參數(shù)表示這個(gè)按鍵是被按下還是釋放燕差;
最后一個(gè)整形參數(shù)表示是否有Ctrl遭笋、Shift、Alt谁不、Super等按鈕的操作
*/
void key_callback( GLFWwindow* window , int key,int scancode, int action, int mode )
{
// 當(dāng)用戶按下ESC鍵,我們?cè)O(shè)置window窗口的WindowShouldClose屬性為true
// 關(guān)閉應(yīng)用程序
if( key == GLFW_KEY_ESCAPE && action == GLFW_PRESS ){
glfwSetWindowShouldClose(window , GL_TRUE );
}
}
二.相關(guān)解析:
1. 關(guān)于 glViewport :
- OpenGL幕后使用glViewport中定義的位置和寬高進(jìn)行2D坐標(biāo)的轉(zhuǎn)換坐梯,將OpenGL中的位置坐標(biāo)轉(zhuǎn)換為你的屏幕坐標(biāo)。例如刹帕,OpenGL中的坐標(biāo)(-0.5, 0.5)有可能(最終)被映射為屏幕中的坐標(biāo)(200,450)吵血。
- 注意,處理過的OpenGL坐標(biāo)范圍只為-1到1偷溺,因此我們事實(shí)上將(-1到1)范圍內(nèi)的坐標(biāo)映射到(0, 800)和(0, 600)蹋辅。
2. 游戲循環(huán):
- glfwWindowShouldClose函數(shù)在我們每次循環(huán)的開始前檢查一次GLFW是否被要求退出,如果是的話該函數(shù)返回true然后游戲循環(huán)便結(jié)束了挫掏,之后為我們就可以關(guān)閉應(yīng)用程序了侦另。
- glfwPollEvents函數(shù)檢查有沒有觸發(fā)什么事件(比如鍵盤輸入、鼠標(biāo)移動(dòng)等)尉共,然后調(diào)用對(duì)應(yīng)的回調(diào)函數(shù)(可以通過回調(diào)方法手動(dòng)設(shè)置)褒傅。我們一般在游戲循環(huán)的開始調(diào)用事件處理函數(shù)。
- glfwSwapBuffers函數(shù)會(huì)交換顏色緩沖(它是一個(gè)儲(chǔ)存著GLFW窗口每一個(gè)像素顏色的大緩沖)袄友,它在這一迭代中被用來繪制殿托,并且將會(huì)作為輸出顯示在屏幕上。
3. 雙緩沖(Double Buffer):
- 應(yīng)用程序使用單緩沖繪圖時(shí)可能會(huì)存在圖像閃爍的問題剧蚣。 這是因?yàn)樯傻膱D像不是一下子被繪制出來的支竹,而是按照從左到右,由上而下逐像素地繪制而成的鸠按。最終圖像不是在瞬間顯示給用戶礼搁,而是通過一步一步生成的,這會(huì)導(dǎo)致渲染的結(jié)果很不真實(shí)目尖。
- 為了規(guī)避這些問題馒吴,我們應(yīng)用雙緩沖渲染窗口應(yīng)用程序。前緩沖保存著最終輸出的圖像瑟曲,它會(huì)在屏幕上顯示募书;而所有的的渲染指令都會(huì)在后緩沖上繪制。當(dāng)所有的渲染指令執(zhí)行完畢后测蹲,我們交換(Swap)前緩沖和后緩沖莹捡,這樣圖像就立即呈顯出來,之前提到的不真實(shí)感就消除了扣甲。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者