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

来源:互联网 发布:mac查看icloud照片 编辑:程序博客网 时间:2024/06/07 07:54

前言

本文都是参考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;}

这里写图片描述


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




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


原创粉丝点击