實(shí)際的OpenGL庫的開發(fā)者通常是顯卡的生產(chǎn)商。你購買的顯卡所支持的OpenGL版本都為這個系列的顯卡專門開發(fā)的。可以用上次提到的OpenGL Extensions View來查看OpenGL版本,我的就是OpenGL4.3。

之前選擇GLAD的時候,選擇OpenGL的核心模式(Core-profile)下進(jìn)行開發(fā)效率高、靈活而且開發(fā)者可以了解OpenGL的具體運(yùn)作。
原先的立即渲染模式(Immediate mode,也就是固定渲染管線)效率低且不靈活雖然上手容易。
1. State Machine ——OpenGL的狀態(tài)通常被稱為上下文(Context)
使用一系列變量描述OpenGL應(yīng)該如何去工作。
更改上下文變量改變OpenGL狀態(tài)——設(shè)置選項,操作緩沖——使用當(dāng)前OpenGL上下文來渲染。
2. Object ——一些選項的集合,它代表OpenGL狀態(tài)的一個子集
unsigned int objectId = 0;// 創(chuàng)建對象
glGenObject(1, &objectId);
glBindObject(GL_WINDOW_TARGET, objectId);// 綁定對象至上下文// 設(shè)置當(dāng)前綁定到 GL_WINDOW_TARGET 的對象的一些選項
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 將上下文對象設(shè)為默認(rèn)
glBindObject(GL_WINDOW_TARGET, 0);
開始創(chuàng)建窗口
1) 實(shí)例化GLFW窗口
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //OpenGL版本4.3
//使用的是核心模式(Core-profile)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
2) 創(chuàng)建窗口
GLFWwindow* window =
glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//創(chuàng)建完窗口我們就可以通知GLFW將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文
3) 初始化GLAD ——管理OpenGL函數(shù)指針
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
load系統(tǒng)相關(guān)的OpenGL函數(shù)指針地址的函數(shù)。GLFW給我們的是glfwGetProcAddress,它根據(jù)我們編譯的系統(tǒng)定義了正確的函數(shù)。
4)視口(Viewport)
將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)。
glViewport(0, 0, 800, 600);
窗口注冊一個回調(diào)函數(shù)(Callback Function),它會在每次窗口大小被調(diào)整的時候被調(diào)用
framebuffer_size_callback(GLFWwindow* window, int width, int height);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
5)渲染循環(huán)(Render Loop)
while(!glfwWindowShouldClose(window))
{
// 渲染指令
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 檢查并調(diào)用事件,交換緩沖
glfwSwapBuffers(window);
glfwPollEvents();
}

浙公網(wǎng)安備 33010602011771號