天天看點

OpenGL學習之旅(五)——Learn OpenGL第一個視窗代碼解讀

Learn OpenGL第一個視窗代碼解讀

之前我搭建好了各類環境,以及一些簡單的基礎理論的學習,但作為一個工程問題,敲代碼也需要同步跟進呢。為此,我選擇了learnOpenGL網站裡的視窗代碼進行從頭學習,并參照文檔在我的代碼裡進行解釋學習。若有不足之處,還請大家支教交流呢。

#include <glad/glad.h>//glad頭檔案包含了正确的OpenGL頭檔案,是以需要在其他依賴于OpenGL的頭檔案之前包含glad
#include <GLFW/glfw3.h>//我們用到的GLFW庫
#include <iostream>//該頭檔案的作用是包含了操作輸入輸出流的方法


void framebuffer_size_callback(GLFWwindow*window,int width,int height);
void processInput(GLFWwindow*window);


int main()
{
	glfwInit();//在main函數中調用glfwInit函數初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);//告訴GLFW,OpenGL的主版本号是3,次版本号也是3
	glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);//告訴OpenGL我們使用的是核心版本模式

	GLFWwindow*window = glfwCreateWindow(800,600,"Hello OpenGL",NULL,NULL);//建立一個視窗程式,該函數傳回一個GLFWwindow對象,在GLFWwindow裡注冊一個window對象。指針變量定義文法:<類型>*<變量名>
	if (window==NULL)
	{
		std::cout<<"Failed to creat GLFW window"<<std::endl;//如果在#include<iostream>後加上using namespace std 那麼就可以寫成cout<<"Hello world!!!"<<endl;可以看成是cout 是std的一個成員函數,std::cout這是引用格式
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);//通知GLFW将我們視窗上下文設定為目前線程的主上下文
	glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);//告訴GLFW我們希望每當視窗調整大小時,回調視口更改函數


	if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//前面提到glad是用來管理OpenGL指針的,在調用其他OpenGL函數時需要初始化glad
	{
		std::cout<<"Failed to initialize GLAD"<<std::endl;
		return -1;
	}                                                      //開始調用glfw内的函數

	while (!glfwWindowShouldClose(window))//渲染循環(Render Loop),采用whlie循環使得GLFW在退出前保持運作,參數檢測是否退出
	{
		processInput(window);//調用後面的輸入函數(這裡做的是檢測按鍵輸入(Esc鍵)
		glClearColor(0.2f,0.3f,0.3f,1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		glfwSwapBuffers(window);//此函數交換顔色緩沖。為了規避加載過程,造成圖像閃爍,從左到右,從上到下繪制而成
		glfwPollEvents();//檢測有木有觸發事件,(比如滑鼠移動、鍵盤輸入等)
	}
	
	glfwTerminate();//渲染結束,正确釋放/删除之前配置設定的資源
	return 0;//傳回值為0,正确退出程式
}



void processInput(GLFWwindow*window)//建立一個檢測輸入函數,這裡檢測ESC是否被按下,如果按下,自動退出
{
	if (glfwGetKey(window,GLFW_KEY_ESCAPE)==GLFW_PRESS)
		glfwSetWindowShouldClose(window,true);

}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)//建立一個函數,當使用者更改視窗大小時,視口也應該被調整。
{
	glViewport(0, 0, width, height);
}
           

繼續閱讀