一、OpenGL 简介

OpenGL 本质:

OpenGL(Open Graphics Library),通常可以认为是API,其包含了一系列可以操作图形、图像的函数。但深究下来,它是由Khronos组织制定并维护的规范,即规定了每个函数该如何执行,以及它们的输出值。根据该OpenGL的规范,开发者可编写各类扩展库


OpenGL 发展:

  • 立即渲染模式:Immediate mode,也就是固定渲染管线,是OpenGL早期的使用渲染模式

    • 优点:对多数细节做了抽象处理,方便调用和理解
    • 缺点:不利于开发者完全操控,且效率低下
  • 核心模式:Core-profile,从OpenGL3.2起替代立即渲染模式的开发方式,迫使开发者使用现代方法进行开发
    • 优点:更高的灵活性和效率,便于开发者深入理解图像编程
    • 缺点:学习难度加大

OpenGL 库:

OpenGL库的作用在于给我们提供了各类方法,OpenGL自身库包含:gl核心库、glu实用库、glut实用工具库(这几个库的介绍:OpenGL库中gl、glu、glut、glaux的关系 - 极客小生

此外,OpenGL的一大特性就是扩展,主要体现在显卡公司所提出的新特性可以以驱动的方法实现,开发者可以在支持这个扩展的显卡上、使用这个扩展提供的一些更先进更有效的图形功能

常见到的库有:GLFW库和、GLEW库、GLAD库:

  • GLFW:一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入
  • GLEW:OpenGL扩展库(OpenGL Extension Wrangler Library),用于帮助C/C++开发者初始化OpenGL扩展功能,并书写可移植的应用程序
  • GLAD:目前较为流行的库。使用了在线服务,编程时可以告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数

二、OpenGL 开发环境配置

推荐佳作:

三、OpenGL 绘制简单窗口

流程简介:

  1. 引用glfw、glew库
  2. 实例化GLFW窗口
  3. 创建、设置GLFWWindow窗口对象
  4. 设置窗口属性(坐标、宽高)
  5. 实现渲染循环
  6. 结束渲染
#include<GL/glew.h>
#include<GLFW/glfw3.h>
#include<iostream>
using namespace std; void processInput(GLFWwindow *window); int main()
{
//1. 实例化GLFW窗口:
//1.1 初始化GLFW库
glfwInit(); //1.2 设置GLFW使用的OpenGL版本是3.3 :主版本号(Major)和次版本号(Minor)
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //1.3 GLFW使用的是核心模式(Core-profile)
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //2. 创建窗口对象:
GLFWwindow* window = glfwCreateWindow(800, 600, "SouthBegonia's Window", NULL, NULL);
//2.1 检验是否创建成功
if (window == NULL)
{
//创建失败则终止GLFW
cout << "open window failed." << endl;
glfwTerminate();
return -1;
}
//2.2 设置当前OpenGL上下文
// 设置参数window中的窗口所关联的OpenGL环境为当前环境,
// 这个环境在当前线程中会一直保持为当前环境,直到另一个环境被设置为当前环境,或者窗口被删除为止
glfwMakeContextCurrent(window); //3. 设置窗口属性:起始坐标x,y(左下角开始),宽高像素
glViewport(0, 0, 800, 600); //4. 实现渲染循环:
// 若window窗口未关闭,则进行操作
while (!glfwWindowShouldClose(window))
{
//4.1 设置窗口颜色/清空颜色缓存
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); //4.2 自定义的输入监测
processInput(window); //4.3 交换颜色缓冲函数
// 实现原理是双缓冲:前buffer存储当前画面信息,后buffer存储下一画面的信息
glfwSwapBuffers(window); //4.4 检查有无触发事件函数
// 比如键盘输入、鼠标移动等、更新窗口状态,并调用对应的回调函数
glfwPollEvents();
} //5. 渲染结束
// 释放/删除之前的分配的所有资源
glfwTerminate(); return 0;
} //输入事件监测函数
void processInput(GLFWwindow *window)
{
//按下ESC键,变更窗口显示状态
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}

四、参考

OpenGL学习 (一) - 简单窗口绘制的更多相关文章

  1. OpenGL学习(2)——绘制三角形

    在创建窗口的基础上,添加代码实现三角形的绘制. 声明和定义变量 在屏幕上绘制一个三角形需要的变量有: 三角形的三个顶点坐标: Vertex Buffer Object 将顶点数据存储在GPU的内存中: ...

  2. 【OpenGL学习】 四种绘制直线的算法

    我是用MFC框架进行测试的,由于本人也没有专门系统学习MFC框架,代码若有不足之处,请指出. 一,先来一个最简单的DDA算法 DDA算法全称为数值微分法,基于微分方程来绘制直线. ①推导微分方程如下: ...

  3. OpenGL学习(2)——绘制三角形(补)

    对上一篇的补充,通过绘制三角形来完成矩形的绘制.此外,完成章节后练习. 绘制矩形 一个矩形由两个三角形组成,因此绘制矩形需要绘制两个三角形,一共6个顶点,其中2个顶点重复画了两次. 为了减小开销,仅储 ...

  4. opengl学习记录1——矩形绘制

    #include <windows.h> #include <gl/GL.h> #include <gl/GLU.h> #include <glut.h> ...

  5. OpenGL学习进程(11)第八课:颜色绘制的详解

        本节是OpenGL学习的第八个课时,下面将详细介绍OpenGL的颜色模式,颜色混合以及抗锯齿.     (1)颜色模式: OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. R ...

  6. opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  7. OpenGL学习进程(4)第二课:绘制图形

    本节是OpenGL学习的第二个课时,下面介绍如何用点和线来绘制图形:     (1)用点的坐标来绘制矩形: #include <GL/glut.h> void display(void) ...

  8. OpenGL学习进程(10)第七课:四边形绘制与动画基础

        本节是OpenGL学习的第七个课时,下面以四边形为例介绍绘制OpenGL动画的相关知识:     (1)绘制几种不同的四边形: 1)四边形(GL_QUADS) OpenGL的GL_QUADS图 ...

  9. OpenGL学习进程(9)在3D空间的绘制实例

        本节将演示在3D空间中绘制图形的几个简单实例:     (1)在3D空间内绘制圆锥体: #include <GL/glut.h> #include <math.h> # ...

随机推荐

  1. java-log4j配置

    引入依赖: <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId ...

  2. SqlServer数据库优化之索引、临时表

    问题:工作是查询一张500万多条数据的表时,查询总是很慢,于是进行优化. --查询表所有索引 use RYTreasureDB EXEC Sp_helpindex [RecordDrawScore] ...

  3. mysql日期存储格式int,timestarmp,datetime

    int (1).4个字节存储,INT的长度是4个字节,存储空间上比datatime少,int索引存储空间也相对较小,排序和查询效率相对较高一点点 (2)可读性极差,无法直观的看到数据. TIMESTA ...

  4. linux 下首次使用github 和其中遇到的问题

    1首先安装git sudo apt-get install git 2配置git文件 git config --global user.name "你的用户名" git confi ...

  5. CodeForces 150E: Freezing with Style

    题目传送门:CF150E. 据说这个傻逼题还有一个 \(\log\) 的做法,但是我还不会. 题意简述: 给定一棵 \(n\)(\(2\le n\le 10^5\))个点的树,边有边权. 定义一条路径 ...

  6. AcWing 38. 二叉树的镜像

    习题地址 https://www.acwing.com/solution/acwing/content/2922/ 题目描述输入一个二叉树,将它变换为它的镜像. 样例 输入树: / \ / \ / \ ...

  7. AJAX异步更改数据库

    前段时间做了一个小网站,里面有个小功能感觉挺好的,在此与大家分享一下,还请各位大神不要笑话小弟的无知. 此功能大概是这个样子的:点击下图中的类别名称,就可以对类别进行修改. 点击类别名称以后,原来的表 ...

  8. Pandas | 20 级联

    Pandas提供了各种工具(功能),可以轻松地将Series,DataFrame和Panel对象组合在一起. pd.concat(objs,axis=0,join='outer',join_axes= ...

  9. 转载:深度学习在NLP中的应用

    之前研究的CRF算法,在中文分词,词性标注,语义分析中应用非常广泛.但是分词技术只是NLP的一个基础部分,在人机对话,机器翻译中,深度学习将大显身手.这篇文章,将展示深度学习的强大之处,区别于之前用符 ...

  10. tomcat Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

      1.情景展示 tomcat 日志时不时会报出如下异常信息,到底是怎么回事? java.lang.IllegalArgumentException: Invalid character found ...