窗口

程序中使用的glad.c和glad.h源码:
链接: https://pan.baidu.com/s/1TmtM7O8J4aTnfP6elIgs7g 密码: g5go

github源码仓库

opengl环境准备

opengl编程从入门到精通-hello,window

OpenGL从入门到精通–你好三角形

OpenGL从入门到精通–着色器的使用

请确认是在包含GLFW的头文件之前包含了GLAD的头文件。GLAD的头文件包含了正确的OpenGL头文件(例如GL/gl.h),所以需要在其它依赖于OpenGL的头文件之前包含GLAD。

  1. 进行任何事之前先初始化glfw

初始化函数glfwInit

// 对glfw进行初始化
glfwInit();
  1. 版本的命中和版本信息的获取(非必须)
// 打印出glfw的版本信息
//    int* major, int* minor, int* rev
int major, minor, rev;
glfwGetVersion(&major, &minor, &rev);
cout << "major = " << major << " minor = " << minor << " rev = " << rev << endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
  1. 创建窗口
// glfw window creation
// glfw创建窗口
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr);
if (window == nullptr)
{std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;
}
// 为当前window设置上下文,每个线程只能设置一个,并且线程之间共用时,需要将当前线程设置为 non-current
glfwMakeContextCurrent(window);

window将在整个程序运行期间,用于维护窗口的上下文和状态,其实整个glfw就是一个大的状态机。

  1. 窗口信息设置
// 设置窗口大小的回调函数,当窗口大小改变时,会调用该函数调整串口的大小
// 注册窗口大小改变回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
  1. 调用任何opengl函数之前,先使用gladLoadGLLoader加载opengl的函数指针
// glad: load all OpenGL function pointers
// glad 会加载所有openGL函数指针,在调用任何opengl函数之前需要先初始化glad
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{cout << "Failed to initialize GLAD" << std::endl;return -1;
}
  1. 窗口渲染
// render loop
// 循环绘图,防止窗口关闭
while (!glfwWindowShouldClose(window))
{// input// -----processInput(window);// Render color// 设置青清空屏幕需要使用的颜色, 更准确的来说,就是一个状态设置函数glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 清空屏幕的颜色 -- 状态使用函数glClear(GL_COLOR_BUFFER_BIT);// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// 交换颜色缓冲区/** 双缓冲(Double Buffer)* 应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。* 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,* 由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,* 而是通过一步一步生成的,这会导致渲染的结果很不真实。* 为了规避这些问题,我们应用双缓冲渲染窗口应用程序。* 前缓冲保存着最终输出的图像,它会在屏幕上显示;* 而所有的的渲染指令都会在后缓冲上绘制。* 当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,* 这样图像就立即呈显出来,之前提到的不真实感就消除了。* */glfwSwapBuffers(window);// 检查有没有欻发手动事件,比如键盘输入,鼠标移动等glfwPollEvents();
}

两个函数的定义

// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{// 用户按下 esc键,就设置退出串口为真if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// opengl渲染串口大小,每次调整窗口cout << "view port call back" << endl;//glViewport(0, 0, width, height);
}

完整代码实现

//
// Created by andrew on 2021/1/17.
//
#include "glad/glad.h"
#include <GLFW/glfw3.h>#include <iostream>using namespace std;void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);// settings C++ style
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;int main()
{// 对glfw进行初始化glfwInit();// 打印出glfw的版本信息//    int* major, int* minor, int* revint major, minor, rev;glfwGetVersion(&major, &minor, &rev);cout << "major = " << major << " minor = " << minor << " rev = " << rev << endl;glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// glfw window creation// glfw创建窗口GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", nullptr, nullptr);if (window == nullptr){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 为当前window设置上下文,每个线程只能设置一个,并且线程之间共用时,需要将当前线程设置为 non-currentglfwMakeContextCurrent(window);// 设置窗口大小的回调函数,当窗口大小改变时,会调用该函数调整串口的大小// 注册窗口大小改变回调函数glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// glad: load all OpenGL function pointers// glad 会加载所有openGL函数指针,在调用任何opengl函数之前需要先初始化gladif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){cout << "Failed to initialize GLAD" << std::endl;return -1;}// render loop// 循环绘图,防止窗口关闭while (!glfwWindowShouldClose(window)){// input// -----processInput(window);// Render color// 设置青清空屏幕需要使用的颜色, 更准确的来说,就是一个状态设置函数glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// 清空屏幕的颜色 -- 状态使用函数glClear(GL_COLOR_BUFFER_BIT);// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// 交换颜色缓冲区/** 双缓冲(Double Buffer)* 应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。* 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,* 由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,* 而是通过一步一步生成的,这会导致渲染的结果很不真实。* 为了规避这些问题,我们应用双缓冲渲染窗口应用程序。* 前缓冲保存着最终输出的图像,它会在屏幕上显示;* 而所有的的渲染指令都会在后缓冲上绘制。* 当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,* 这样图像就立即呈显出来,之前提到的不真实感就消除了。* */glfwSwapBuffers(window);// 检查有没有欻发手动事件,比如键盘输入,鼠标移动等glfwPollEvents();}// 正确的释放之前分配的所有资源glfwTerminate();return 0;
}// process all input: query GLFW whether relevant keys are pressed/released this frame and react accordingly
// ---------------------------------------------------------------------------------------------------------
void processInput(GLFWwindow *window)
{// 用户按下 esc键,就设置退出串口为真if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}// glfw: whenever the window size changed (by OS or user resize) this callback function executes
// ---------------------------------------------------------------------------------------------
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{// opengl渲染串口大小,每次调整窗口cout << "view port call back" << endl;//glViewport(0, 0, width, height);
}

整个程序执行结果如下:

opengl编程从入门到精通-hello,window相关推荐

  1. 《Linux C编程从入门到精通》——第 1 章 Linux基础 1.1Linux的起源、发展和分类...

    本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.1节,作者:宋磊 , 程钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 第 1 章 ...

  2. 《Linux C编程从入门到精通》一第1章 Linux基础1.1 Linux的起源、发展和分类

    本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.1节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查看 第1章 Li ...

  3. ASP网络编程从入门到精通 下载

    <ASP网络编程从入门到精通> 清华大学出版社 特点: 面向ASP零基础读者,循序渐进 全面分析ASP技术细节 用代码描述个个知识点,操作性强 通过典型模块设计,体会ASP的奥妙 通过网上 ...

  4. linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...

    摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...

  5. python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...

    你想要学习python编程,却不知道该看哪本书?今天小编精选了学习python的十本精品书籍,并且还编写了推荐理由分享给你,希望可以给有选择困难症的同学一点帮助! 1.<"笨办法学&q ...

  6. python编程从入门到精通 叶维忠 pdf-叶维忠《Python编程从入门到精通》PDF

    叶维忠<Python编程从入门到精通>PDF 首页 > 计算机类 字号:小 中 大 评论:0 条 评论:0 条 Python编程从入门到精通 作 者 :叶维忠编著 出版发行 : 北京 ...

  7. python语言入门pdf-Python编程从入门到精通.pdf

    作 者 :叶维忠 出版发行 : 北京:人民邮电出版社 , 2018.11 ISBN号 :978-7-115-47880-1 页 数 : 429 原书定价 : 79.00 主题词 : 软件工具-程序设计 ...

  8. python编程从入门到精通pdf-Python编程从入门到精通.pdf

    作 者 :叶维忠 出版发行 : 北京:人民邮电出版社 , 2018.11 ISBN号 :978-7-115-47880-1 页 数 : 429 原书定价 : 79.00 主题词 : 软件工具-程序设计 ...

  9. python编程从入门到精通pdf-终于晓得python编程从入门到精通

    虽然在编程语言的热度榜上,还是java排行第一,但是python却是最近2年上升最快的,越来越多人都开始选择实用python了,原因很简单,语法语句简约,开发效率高.以下是小编为你整理的python编 ...

最新文章

  1. CPU芯片哪家强?电视处理器这么选就对了!
  2. GNU make manual 翻译(四十)
  3. 数据结构上机测试1:顺序表的应用
  4. C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述
  5. vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
  6. Kafka 入门 and kafka+logstash 实战应用
  7. 【APICloud系列|38】 微信登录分享、QQ登录分享实现方法
  8. [你必须知道的.NET]第十五回:继承本质论
  9. Windows高级编程学习笔记(三)
  10. 码农的自我修炼之路-----BST
  11. 罗盘时钟制作代码_抖音超火的姓氏罗盘壁纸,安卓和苹果都能做
  12. 高清银行LOGO图片整合分享
  13. 微PE制作U盘启动盘教程
  14. 关于SVN报错问题错误码E175002的解决方案
  15. 机器学习算法之GMM模型
  16. java里的哈希值。
  17. flashplayer Debug下载地址
  18. 解决JS中出现的兼容性问题
  19. (PPT抠图)设置透明色/删除背景
  20. wordpress社会化登陆插件Open Social设置教程

热门文章

  1. Windows 7防火墙设置详解(三)
  2. hdu 1723(简单dp)
  3. linux 压缩解压打包
  4. linux 使用buildroot制作文件系统
  5. 通过负载均衡器+域名实现容灾切换-(3)浏览器的DNS缓存过程
  6. 【旧文章搬运】Windows中全局钩子DLL的加载过程
  7. poj2392 Space Elevator
  8. UML大战需求分析--阅读笔记02
  9. Leetcode题解(26)
  10. 缓存和字符串相互转换