opengl编程从入门到精通-hello,window
窗口
程序中使用的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。
- 进行任何事之前先初始化
glfw
初始化函数glfwInit
// 对glfw进行初始化
glfwInit();
- 版本的命中和版本信息的获取(非必须)
// 打印出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);
- 创建窗口
// 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
就是一个大的状态机。
- 窗口信息设置
// 设置窗口大小的回调函数,当窗口大小改变时,会调用该函数调整串口的大小
// 注册窗口大小改变回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
- 调用任何
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;
}
- 窗口渲染
// 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相关推荐
- 《Linux C编程从入门到精通》——第 1 章 Linux基础 1.1Linux的起源、发展和分类...
本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.1节,作者:宋磊 , 程钢著,更多章节内容可以访问云栖社区"异步社区"公众号查看 第 1 章 ...
- 《Linux C编程从入门到精通》一第1章 Linux基础1.1 Linux的起源、发展和分类
本节书摘来自异步社区<Linux C编程从入门到精通>一书中的第1章,第1.1节,作者 宋磊 , 程钢,更多章节内容可以访问云栖社区"异步社区"公众号查看 第1章 Li ...
- ASP网络编程从入门到精通 下载
<ASP网络编程从入门到精通> 清华大学出版社 特点: 面向ASP零基础读者,循序渐进 全面分析ASP技术细节 用代码描述个个知识点,操作性强 通过典型模块设计,体会ASP的奥妙 通过网上 ...
- linux c 并行编程从入门到精通,VISUAL STUDIO 2010并行编程从入门到精通(微软技术丛书)...
摘要: <微软技术丛书:Visual Studio2010并行编程从入门到精通>循序渐进,步骤式动手练习迅速帮助读者掌握并行编程的基础知识. <微软技术丛书:Visual Studi ...
- python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...
你想要学习python编程,却不知道该看哪本书?今天小编精选了学习python的十本精品书籍,并且还编写了推荐理由分享给你,希望可以给有选择困难症的同学一点帮助! 1.<"笨办法学&q ...
- python编程从入门到精通 叶维忠 pdf-叶维忠《Python编程从入门到精通》PDF
叶维忠<Python编程从入门到精通>PDF 首页 > 计算机类 字号:小 中 大 评论:0 条 评论:0 条 Python编程从入门到精通 作 者 :叶维忠编著 出版发行 : 北京 ...
- python语言入门pdf-Python编程从入门到精通.pdf
作 者 :叶维忠 出版发行 : 北京:人民邮电出版社 , 2018.11 ISBN号 :978-7-115-47880-1 页 数 : 429 原书定价 : 79.00 主题词 : 软件工具-程序设计 ...
- python编程从入门到精通pdf-Python编程从入门到精通.pdf
作 者 :叶维忠 出版发行 : 北京:人民邮电出版社 , 2018.11 ISBN号 :978-7-115-47880-1 页 数 : 429 原书定价 : 79.00 主题词 : 软件工具-程序设计 ...
- python编程从入门到精通pdf-终于晓得python编程从入门到精通
虽然在编程语言的热度榜上,还是java排行第一,但是python却是最近2年上升最快的,越来越多人都开始选择实用python了,原因很简单,语法语句简约,开发效率高.以下是小编为你整理的python编 ...
最新文章
- CPU芯片哪家强?电视处理器这么选就对了!
- GNU make manual 翻译(四十)
- 数据结构上机测试1:顺序表的应用
- C++ Primer 5th笔记(chap 14 重载运算和类型转换)重载运算概述
- vue 声明周期函数_Vue2.0 探索之路——生命周期和钩子函数的一些理解
- Kafka 入门 and kafka+logstash 实战应用
- 【APICloud系列|38】 微信登录分享、QQ登录分享实现方法
- [你必须知道的.NET]第十五回:继承本质论
- Windows高级编程学习笔记(三)
- 码农的自我修炼之路-----BST
- 罗盘时钟制作代码_抖音超火的姓氏罗盘壁纸,安卓和苹果都能做
- 高清银行LOGO图片整合分享
- 微PE制作U盘启动盘教程
- 关于SVN报错问题错误码E175002的解决方案
- 机器学习算法之GMM模型
- java里的哈希值。
- flashplayer Debug下载地址
- 解决JS中出现的兼容性问题
- (PPT抠图)设置透明色/删除背景
- wordpress社会化登陆插件Open Social设置教程