• 第 2 篇:绘制一个窗口


    目录

            一、实例化GLFW窗口

            1、GLFW初始化

            2、查看GLFW版本信息

            3、创建窗口对象 

    二、GLAD

            1、初始化GLAD

            2、视口

            3、渲染 

            4、释放资源

            三、实验源码

            1、显示窗口

            2、修改背景色


    一、实例化GLFW窗口

    1、GLFW初始化

    1. #include <glad/glad.h>
    2. #include <GLFW/glfw3.h>
    3. #include <iostream>
    4. int main() {
    5. glfwInit();//初始化GLFW
    6. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
    7. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
    8. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
    9. //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码
    10. return 0;
    11. }

    上面的代码如果发生如下报错,请查看解决办法链接:(3条消息) 解决错误: LNK2019 无法解析的外部符号_代码骑士的博客-CSDN博客

     2、查看GLFW版本信息

    1. void getVersion() {
    2. int Major, Minor, Rev;
    3. glfwGetVersion(&Major, &Minor, &Rev);
    4. printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
    5. }

    调用这个函数输出版本信息

    3、创建窗口对象 

    1. void createWindow() {
    2. GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
    3. if (window == NULL) {//创建失败
    4. std::cout << "Failed to create GLFW window" << std::endl;
    5. glfwTerminate();
    6. return;
    7. }
    8. glfwMakeContextCurrent(window);
    9. }

     

    二、GLAD

    1、初始化GLAD

    glad是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们都需要初始化GLAD

    1. if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    2. {
    3. std::cout << "Failed to initialize GLAD" << std::endl;
    4. return -1;
    5. }

    2、视口

    在开始渲染之前,我们要先设置OpenGL渲染窗口的尺寸大小,即视口(ViewPort)。目的是使OpenGL知道窗口的大小和坐标。我们可以通过调用glViewport函数设置窗口维度(Dimension):

    glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)

    注意:

    回调函数:

    void framebuffer_size_callback(GLFWwindow* window, int width, int height);

     

    1. void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    2. glViewport(0, 0, width, height);
    3. }

     

    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

     

    3、渲染 

    为了使我们的窗口能够持续渲染并且可以接收到用户输入,我们要在程序中添加一段while循环,也可称之为渲染循环(Render Loop),它能够在我们让GLF退出前一直保持运行。

    1. while (!glfwWindowShouldClose(window))
    2. {
    3. glfwSwapBuffers(window);
    4. glfwPollEvents();
    5. }

    函数说明:

     

     

    4、释放资源

     

    glfwTerminate();

     

    三、实验源码

    1、显示窗口

    1. #include <glad/glad.h>
    2. #include <GLFW/glfw3.h>
    3. #include <iostream>
    4. #include<conio.h>
    5. void getVersion() {
    6. int Major, Minor, Rev;
    7. glfwGetVersion(&Major, &Minor, &Rev);
    8. printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
    9. }
    10. GLFWwindow* createWindow() {
    11. GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
    12. if (window == NULL) {//创建失败
    13. std::cout << "Failed to create GLFW window" << std::endl;
    14. glfwTerminate();
    15. return window;
    16. }
    17. glfwMakeContextCurrent(window);
    18. //_getch();
    19. return window;
    20. }
    21. //回调函数
    22. void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    23. glViewport(0, 0, width, height);
    24. }
    25. int main() {
    26. glfwInit();//初始化GLFW
    27. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
    28. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
    29. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
    30. //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码
    31. getVersion();
    32. //createWindow();
    33. GLFWwindow* window = createWindow();
    34. if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    35. {
    36. std::cout << "Failed to initialize GLAD" << std::endl;
    37. return -1;
    38. }
    39. //glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)
    40. framebuffer_size_callback(window, 800, 600);
    41. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    42. while (!glfwWindowShouldClose(window))
    43. {
    44. glfwSwapBuffers(window);
    45. glfwPollEvents();
    46. }
    47. glfwTerminate();
    48. return 0;
    49. }

     输出结果:

     

    2、修改背景色

    渲染指令代码结构:

    1. //渲染循环
    2. while (!glfwWindowShouldClose(window))
    3. {
    4. //输入
    5. processInput(window);
    6. //渲染指令
    7. //……
    8. //检测并调用事件,交换缓冲
    9. glfwPollEvents();
    10. glfwSwapBuffers(window);
    11. }

     

     

    1. #include <glad/glad.h>
    2. #include <GLFW/glfw3.h>
    3. #include <iostream>
    4. #include<conio.h>
    5. void getVersion() {
    6. int Major, Minor, Rev;
    7. glfwGetVersion(&Major, &Minor, &Rev);
    8. printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
    9. }
    10. GLFWwindow* createWindow() {
    11. GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
    12. if (window == NULL) {//创建失败
    13. std::cout << "Failed to create GLFW window" << std::endl;
    14. glfwTerminate();
    15. return window;
    16. }
    17. glfwMakeContextCurrent(window);
    18. //_getch();
    19. return window;
    20. }
    21. //回调函数
    22. void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
    23. glViewport(0, 0, width, height);
    24. }
    25. int main() {
    26. glfwInit();//初始化GLFW
    27. glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
    28. glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
    29. glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
    30. //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码
    31. getVersion();
    32. //createWindow();
    33. GLFWwindow* window = createWindow();
    34. if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    35. {
    36. std::cout << "Failed to initialize GLAD" << std::endl;
    37. return -1;
    38. }
    39. //glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)
    40. framebuffer_size_callback(window, 800, 600);
    41. glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    42. //渲染循环
    43. while (!glfwWindowShouldClose(window))
    44. {
    45. //输入
    46. //processInput(window);
    47. //渲染指令
    48. glClearColor(0.0f, 0.34f, 0.57f, 1.0f);
    49. glClear(GL_COLOR_BUFFER_BIT);
    50. //检测并调用事件,交换缓冲
    51. glfwPollEvents();
    52. glfwSwapBuffers(window);
    53. }
    54. glfwTerminate();
    55. return 0;
    56. }

     

     

  • 相关阅读:
    疾病预防控制中心实验室信息管理系统智慧疾控参数需求
    C++笔记1(数组,冒泡排序,二维数组,函数,指针,结构体)
    Oracle并发与多版本控制
    闪电藤文件传输助手上线
    linux笔记(5):按照东山派的官方教程编译buildroot(东山哪吒,D1-H)踩坑记录
    浩哥的博客之路
    营销技术(Martech)的持续爆炸式增长,市场总监的工作变得更加艰难
    SAP 公司代码全局参数设置及其意义
    OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库
    java基于springboot+vue驾校预约网站管理系统
  • 原文地址:https://blog.csdn.net/qq_51701007/article/details/125421665