这是我的第一篇博客,试着记录学习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)——创建窗口的更多相关文章

  1. OpenGL学习 (一) - 简单窗口绘制

    一.OpenGL 简介 OpenGL 本质: OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形.图像的函数.但深究下来,它是由Khronos ...

  2. GTK学习笔记————创建窗口

    创建gtk1.c文件 代码 #include <gtk/gtk.h> int main (int argc, char *argv[]) { GtkWidget *window; gtk_ ...

  3. OpenGL学习(2)—— 创建第一个窗口

    创建 GLFW GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口.它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入,这正是我们需要的. #inclu ...

  4. Linux OpenGL 实践篇-2 创建一个窗口

    OpenGL 作为一个图形接口,并没有包含窗口的相关内容,但OpenGL使用必须依赖窗口,即必须在窗口中绘制.这就要求我们必须了解一种窗口系统,但不同的操作系统提供的创建窗口的API都不相同,如果我们 ...

  5. 基于OpenGL编写一个简易的2D渲染框架-01 创建窗口

    最近正在学习OpenGL,我认为学习的最快方法就是做一个小项目了. 如果对OpenGL感兴趣的话,这里推荐一个很好的学习网站 https://learnopengl-cn.github.io/ 我用的 ...

  6. [转]用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口

    原文链接: 1.用多线程方法实现在MFC/WIN32中调用OpenGL函数并创建OpenGL窗口 2.Windows MFC 两个OpenGL窗口显示与线程RC问题

  7. OpenGL 使用GLFW创建全屏窗口

    OpenGL 使用GLFW创建全屏窗口 GLFW库里面的glfwCreateWindow()函数是用来创建窗口的函数. 这样函数的原型是: GLFWwindow* glfwCreateWindow(i ...

  8. OpenGL学习笔记5——嵌入Qt框架

    学习OpenGL也有段时间了,前几篇将GL最基本的画图过程解析了一下,后面进阶的就随项目需要再学.因为之前一直是用glut这个实用工具包来开发很方便,但是会附带一个控制台的窗口,实在觉得有些low,因 ...

  9. OpenGL学习进程(12)第九课:矩阵乘法实现3D变换

    本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈.     (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...

随机推荐

  1. JMeter—逻辑控制器(六)

    参考<全栈性能测试修炼宝典JMeter实战>第六章 JMeter 元件详解中第一节JMeter逻辑控制器 JMeter逻辑控制器可以对元件的执行逻辑进行控制,除仅一次控制器外,其他可以嵌套 ...

  2. Android (checkBox)

    1.使用 setOnCheckedChangeListener()方法对checkBox进行事件监听 2.重写方法 public void onCheckedChanged(CompoundButto ...

  3. final 关键字的作用及应用案例

    final关键字的作用如下: 1.可以修饰成员变量,但不能对该成员变量进行修改: 2.可以修饰局部变量,但不能地该局部变量进行修改: 3.可以修饰成员方法(继承),但不能对父类成员方法进行重写: 4. ...

  4. 开启 J2EE(一)—‘全明星队伍’

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/akkzhjj/article/details/27973427 J2EE-一套规范 J2EE(Jav ...

  5. Kafka远程调试简单记录

    Kafka启动脚本: ./kafka-server-start.sh -daemon ../config/server.properties 最终翻阅脚本可以确定是调用kafka-run-class. ...

  6. pku-2909 (欧拉筛)

    题意:哥德巴赫猜想.问一个大于2的偶数能被几对素数对相加. 思路:欧拉筛,因为在n<215,在3万多,一个欧拉筛得时间差不多4*104, 那么筛出来的素数有4千多个,那么两两组合直接打表,时间复 ...

  7. Linux下rz/sz安装及使用方法

    新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz ...

  8. oracle 查询非自增长分区的最大分区

    select a.table_owner, a.table_name, a.max_partition  from (select table_owner, table_name, max(parti ...

  9. 从Excel表导入数据到Table

    步骤: 1.写第一行SQL,(本sql对应的是oracle数据库) ="INSERT INTO TD_PROMOTION_RATE VALUES("&A3&&quo ...

  10. javax.servlet.http.HttpServlet" was not found on the Java Build Path

    问题解决(以maven为例): 只需在pom.xml导入对应的两个依赖即可解决该问题: <dependency> <groupId>javax.servlet.jsp</ ...