OpenGL学习(1)——创建窗口
这是我的第一篇博客,试着记录学习OpenGL的过程。使用的教程:LearnOpenGL,系统:Deepin 15.9.3,IDE:Qt Creator。
添加头文件
创建窗口用到两个库:GLFW和GLAD,这里GLAD也可以替换成GLEW。添加头文件很简单,直接include就好:
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
注意添加GLAD和GLFW头文件的次序,如果先添加GLFW的头文件,在编译时会报错。
初始化GLFW
调用函数 glfwInit在程序最开始初始化GLFW库:
glfwInit();
配置GLFW
调用函数glfwWindowHint为之后调用创建窗口函数配置Hint,这里配置两个Hint:OpenGL版本和Profile类型。
因为我使用的是OpengGL 3.0,所以配置版本号为3,另外选择Core Profile作为Profile类型:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
顺带一提Deepin或Ubuntu下查看OpenGL版本号的方法。两条指令:
sudo apt-get install mesa-utils
glxinfo
创建窗口
调用glfwCreateWindow函数创建窗口,需要四个参数,分别是:width、height、title、monitor和share,并返回一个GLFWwindow类型的对象。这里忽略最后两个参数,均设置成NULL。
设置窗口的宽度为800,高度为600,标题为“OpenGL_Demo”:
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_Demo", NULL, NULL);
调用glfwMakeContextCurrent函数设置已创建窗口的Context为当前线程的主Context:
glfwMakeContextCurrent(window);
初始化GLAD
我也不清楚GLAD库的具体作用,教程上说是用来管理OpenGL的函数指针,所以需要在调用OpenGL的函数前初始化GLAD。概念绕来绕去的,就先放一放。
将GLFW库的glfwGetProcAddress函数传递给GLAD,glfwGetProcAddress返回OpenGL函数的地址:
gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);
配置视口Viewport
视口是实际用来渲染的窗口,维度一般和窗口window的维度相同,也可以将视口的维度设置得比window的维度小或是大。
调用glViewport函数进行配置,需要四个参数:x、y、width和height。(x, y)是视口左下角的坐标,这里设置成(0, 0):
glViewport(0, 0, 800, 600);
渲染循环
为了使程序在用户关闭窗口前一直处于渲染的状态,还需要一个while循环:
while(!glfwWindowShouldClose(window)){
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwWindowShouldClose函数检测用户是否要求关闭窗口。glfwPollEvents函数检测是否有事件被触发,比如键盘的输入或者鼠标的移动。glfwSwapBuffers用来交换Front Buffer和Back Buffer,并在窗口显示绘制的内容。
释放资源
最后调用glfwTerminate函数释放分配的资源:
glfwTerminate()
完整代码如下:
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
using namespace std;
//void frambuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
int main()
{
//initialize GLFW
glfwInit();
//configure GLFW
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
//creat a window object
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_Demo", NULL, NULL);
if (window == NULL){
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
//initialize GLAD to manage function pointers for OpenGL
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
cout << "Failed to initialize GLAD" << endl;
return -1;
}
//set width and height of Viewport
glViewport(0, 0, 800, 600);
//glfwSetFramebufferSizeCallback(window, frambuffer_size_callback);
//render loop
while(!glfwWindowShouldClose(window)){
processInput(window);
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
/*
void frambuffer_size_callback(GLFWwindow *window, int width, int height)
{
glViewport(0, 0, width, height);
}
*/
void processInput(GLFWwindow* window)
{
//check if ESCAPE is pressed
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
OpenGL学习(1)——创建窗口的更多相关文章
- OpenGL学习 (一) - 简单窗口绘制
一.OpenGL 简介 OpenGL 本质: OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形.图像的函数.但深究下来,它是由Khronos ...
- GTK学习笔记————创建窗口
创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...
- OpenGL学习(2)—— 创建第一个窗口
创建 GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口.它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的. #inclu ...
- Linux OpenGL 实践篇-2 创建一个窗口
OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...
- 基于OpenGL编写一个简易的2D渲染框架-01 创建窗口
最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的 ...
- [转]用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口
原文链接: 1.用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口 2.Windows MFC 两个OpenGL窗口显示与线程RC问题
- OpenGL 使用GLFW创建全屏窗口
OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...
- OpenGL学习笔记5——嵌入Qt框架
学习OpenGL也有段时间了,前几篇将GL最基本的画图过程解析了一下,后面进阶的就随项目需要再学.因为之前一直是用glut这个实用工具包来开发很方便,但是会附带一个控制台的窗口,实在觉得有些low,因 ...
- OpenGL学习进程(12)第九课:矩阵乘法实现3D变换
本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈. (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...
随机推荐
- 安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败
安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server ...
- Zabbix3.x 监控磁盘IO与自定义模板
引言 Zabbix自带的模板,帮助我们完成了一些比较常用的监控.但如果想要监控磁盘的IO,zabbix并没有给我们提供这么一个模板,所以我们需要自己来创建一个模板来完成磁盘IO的监控. 操作步骤 1. ...
- ghostscript远程代码执行漏洞复现
这两天网上ghostscript又又有漏洞信息了,但是没有poc,于是找找资料把今年8月21日的那个验证下 1.关于ghostscript Ghostscript是一套建基于Adobe.PostScr ...
- 12个HTML和CSS必须知道的重点难点问题
这12个问题,基本上就是HTML和CSS基础中的重点个难点了,也是必须要弄清楚的基本问题,其中定位的绝对定位和相对定位到底相对什么定位?这个还是容易被忽视的,浮动也是一个大坑,有很多细节.这12个知识 ...
- js实现Mac触摸板双指事件(上/下/左/右/放大/缩小)
前言 这几天在修复一个web问题时,需要捕获Mac触摸板双指事件(上.下.左.右.放大.缩小),但发现并没有现成的轮子,还是要自己造. 例如:jquery.mousewheel.js(添加跨浏览器的鼠 ...
- 深入探究JFreeChart
1 简介 JFreeChart 是 SourceForge.net 上的一个开源项目,它的源码和 API 都可以免费获得. JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三维 ) , ...
- javascript中apply()和call()方法及区别
call()和apply()方法 1.方法定义 call方法: 语法:obj.call(thisObj, arg1, arg2, ...); 定义:调用一个对象的一个方法,以另一个对象替换当前对象. ...
- IDEA多线程调试设置
转至:http://blog.csdn.net/kevindai007/article/details/71412324 使用idea调试多线程的时候发现多线程无法调试,后来经过搜索发现,idea的断 ...
- 对JavaScript垃圾回收机制的理解?
(1)标记清除(Mark and sweep) 这是JavaScript最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为”进入环境”,当变量离开环境的时候( ...
- 静态分析Android程序
快速定位Android程序的关键代码 1.通过apktool反编译apk文件,得到AndroidManifest.xml文件,可以得到程序用到的组建.配置.以及主Activity 2.信息反馈法(特殊 ...