include <stdio.h>
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main(int argc, char **argv){
using std::cout; using std::endl;
glfwInit();
// 主版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
// 次版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
// 告訴glfw 我們使用的是core_profile 核心模塊
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 向前兼容
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 創(chuàng)建一個(gè)GLFW 窗口 寬 高 窗口名字 后邊兩個(gè)暫時(shí)不用管
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
// 通知GLFW將我們窗口的上下文設(shè)置為當(dāng)前線程的主上下文了
glfwMakeContextCurrent(window);
// GLAD 是用來(lái)管理openGL 的函數(shù)指針的顽馋。所以在調(diào)用任何openGL函數(shù)之前我們都需要初始化GLAD品嚣。
// 我們給GLAD傳入了用來(lái)加載系統(tǒng)相關(guān)的OpenGL函數(shù)指針地址的函數(shù)送滞。GLFW給我們的是glfwGetProcAddress,它根據(jù)我們編譯的系統(tǒng)定義了正確的函數(shù)朽褪。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 創(chuàng)建渲染的視口: 我們必須要告訴OpenGl 需要渲染的尺寸大小置吓,即為視口 viewport(),這樣openGL 才能知道根據(jù)窗口大小顯示數(shù)據(jù)和坐標(biāo)。
// glViewport 前兩個(gè)參數(shù)控制視口左下角位置缔赠,后兩個(gè)參數(shù)控制視口的寬和高
// openGL 幕后使用的是glViewport 定義的 位置和寬高進(jìn)行2D轉(zhuǎn)換
glViewport(0, 0, 800, 600);
// 窗口調(diào)整的時(shí)候 視口應(yīng)該也被調(diào)整 對(duì)窗口注冊(cè)一個(gè)回調(diào)函數(shù)每次窗口大小被調(diào)整的時(shí)候會(huì)被調(diào)用
void framebuffer_size_callback(GLFWwindow *window, int width, int height);
// 通過(guò) glfwSetFramebufferSizeCallback glfw 函數(shù) 當(dāng)窗口frame 變化時(shí)會(huì)調(diào)用衍锚。
// 對(duì)于視網(wǎng)膜屏 Retain 屏 寬度和高度明顯比原輸入值更高一點(diǎn)。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
void processInput(GLFWwindow *window);
// 為了防止 渲染的圖像一出現(xiàn)就退出 我們使用while 循環(huán) 嗤堰。我們可以稱(chēng)之為Render Loop
// glfwWindowShouldClose 每次循環(huán)開(kāi)始前檢查一次GLFW 是否被要求退出 是true 的話(huà)渲染便結(jié)束了构拳。
while(!glfwWindowShouldClose(window))
{
//輸出控制
processInput(window);
// glfwSwapBuffers 會(huì)交換顏色緩沖(他是存儲(chǔ)著GLFW 窗口每一個(gè)像素色值的大緩沖),將會(huì)作為輸出顯示在屏幕上
// 當(dāng)程序退出的時(shí)候 使用一個(gè)自定義的顏色清空屏幕 在每個(gè)新的渲染迭代可是的時(shí)候我們總希望清屏否則總是看到上次渲染的結(jié)果梁棠。
// 我們可以使用glClear GL_COLOR_BUFFER_BIT置森,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。 我們清空顏色 符糊。
glClearColor(0.5f, 0.1f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
// glfwPollEvents 檢查函數(shù)有沒(méi)有觸發(fā)什么事件 鍵盤(pán)輸入 鼠標(biāo)移動(dòng) 并調(diào)用對(duì)應(yīng)函數(shù)
glfwPollEvents();
}
glfwTerminate();
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void processInput(GLFWwindow *window)
{
//
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
這是一個(gè)基本的圖形繪制流程凫海。