OpenGL 你好窗口

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) 。我們可以稱之為Render Loop
//    glfwWindowShouldClose 每次循環(huán)開始前檢查一次GLFW 是否被要求退出 是true 的話渲染便結(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ā)什么事件 鍵盤輸入 鼠標(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è)基本的圖形繪制流程。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容