OpenGL学习(二):第一个GLFW窗口

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/zhouyelihua https://blog.csdn.net/zhouyelihua/article/details/73845127

前言

本文都是参考https://learnopengl.com/#!Getting-started/Hello-Triangle

中文翻译网址:https://learnopengl-cn.github.io/

代码也是来自该网站,主要添加一些注释以及个人的一些理解。

名词术语

opengl的窗口值问题

  利用glfw设置窗口的时候设置的实际的像素值glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL) 但是OpenGL的窗口值是从-1到1的显示。而(0,0)点就是窗口的中心。

双缓存

  当程序仅仅使用一个缓存的时候,由于物理屏幕以固定的帧率从上到下,从左到右进行刷新屏幕,刷新操作是瞬时的,那么在第二帧刷新之前就可能存在伪像。所以我们采用的双缓冲,所有的渲染都发生在后台缓冲,它位于内存区域,当所有的渲染完成的时候,将他交换到前台,将前台的缓冲交换到后台

代码分析

代码下载

  http://download.csdn.net/detail/zhouyelihua/9882947

代码分析

#include<iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
void framebuffer_size_callback(GLFWwindow* window, int width, int height)//这个是窗口变化的回调函数。。注意输入参数
                                                                         //是一个glfw的窗口,一个宽度和高度
{
    glViewport(0, 0, width, height);//这个是回调函数内的内容
                                    //这里是将视口改成变化后的的窗口大小
                                    //注意需要的注册该回调函数
                                    //glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
                                    //两个参数是,glfw的窗口以及回调函数
}
void processInput(GLFWwindow *window)
{
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)//获取按键,如果等于esc 
        glfwSetWindowShouldClose(window, true);//利用强制窗口应该关闭
}
int main()
{
    glfwInit();//类似于之前的gluinit一般采用库都需要进行初始化
    //版本号是opengl4.5
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//设置主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);//设置次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//在mac系统上需要设置该语句
    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);
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))//在调用opengl函数之前初始化glad,
                                                            //glad的作用就是快速的将opengl函数映射到相关的显卡函数上
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }
    glViewport(0, 0, 800, 600);//设置视口大小
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);//注册函数,该函数还可以注册其他相关硬件的回调函数
                                                                      //
    //渲染流程
    while (!glfwWindowShouldClose(window))//检测glfw窗口是否被指令要求关闭,如果是的话,则会退出循环
    {

        //输入的相关操作
        processInput(window);//



        // 渲染的相关操作

        glClearColor(1.0f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        //查看所有的事件,并且交换内存
        glfwSwapBuffers(window);//交换颜色缓存,即glfw窗口内的内容。。。注意glfw开头的交换和后面gl开头的区别
        glfwPollEvents();//检测是否有其他的触发时间,例如上述的窗口大小变化,需要调用相关的回调函数
    }
    glfwTerminate();//清除退出
    return 0;
}

这里写图片描述


如果您觉得此博客对您有用,欢迎对我进行小额赞助。




不筹钱娶媳妇的程序员不是好程序员!


猜你喜欢

转载自blog.csdn.net/zhouyelihua/article/details/73845127
今日推荐