【OpenGL】OpenGL简介

文章目录

  • OpenGL概述
  • OpenGL的本质
  • OpenGL相关库
    • 核心库
    • 窗口管理
      • glut
      • freeglut
      • glfw
    • 函数加载
      • glew
      • GLAD


OpenGL概述

OpenGL(Open Graphics Library) 严格来说,本身并不是一个API,它是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定。

实际上OpenGL的大多数实现都是由显卡厂商编写的,即一系列可以操作图形、图像的API。当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL。

这里科普一下Khronos组织,由Intel、Nvidia等公司共同创立,致力于创建开放标准的应用程序API。OpenGL、OpenGL ES、WebGL、Vulkan都是来自Khronos。而Vulkan称为“下一版本的OpenGL”,旨在提供更低的CPU开销和更多GPU控制。Android API 24以后支持Vulkan,iOS在WWDC2014也推出Metal。

Windows平台常用绘图引擎

Vulkan与OpenGL对比——Vulkan的全新渲染架构
在这里插入图片描述

OpenGL有两套API

  • 核心模式(Core-profile)
    也叫做可编程管线,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
  • 立即渲染模式(Immediate mode)
    也叫做固定渲染管线,早期OpenGL使用的模式。大多数功能都被库隐藏起来,容易理解和使用,但是灵活性和效率太低。
    从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发

这与 GPU 的发展历史有关,最初的 GPU 是不能编程的,也叫固定管线,就是把数据按照固定的通路走完,后来发展出了可编程的 GPU,也叫可编程管线,一开始只能用汇编写 GPU 程序,然后进一步发展出了 GPU 高级编程语言,也就是现在所说的着色语言(Shading Language)
了解了 GPU 的发展历史就明白为什么 OpenGL 会有两套 API 了。立即渲染模式 就是最初 GPU 不能编程时的 API,核心模式 则是使用了着色语言的现代 API。
最新版本的 OpenGL 对立即渲染模式也是支持的,故而也把立即渲染模式称为兼容模式

OpenGL - The Industry Standard for High Performance Graphics

LearnOpenGL文档

OpenGL的本质

As long as you keep in mind that OpenGL is bsically one large state machine, most of its functionality will make more sense.

OpenGL自身是一个巨大的状态机(state machine)

  • 即变量(描述该如何操作)的大集合。
  • OpenGL的状态通常别称作上下文(context)
  • 状态设置函数(State-changing Function)
  • 状态应用函数(State-using Function)

在这里插入图片描述

通过改变一些上下文变量来改变OpenGL的状态,从而告诉OpenGL如何绘图。

  • 一个对象(Object)是指一些选项的集合,代表OpenGL状体的一个子集。可以把对象看作一个C风格的结构体。
    struct object_name {
    	GLfloat option1;
    	GLuint option2;
    	GLchar[] name;
    };
    
  • 上下文(Context)往往看作是包含很多对象的大的结构体。
    struct OpenGL_Context {
    	object* object_window_target;
    	...
    };
    

OpenGL相关库

核心库

Windows平台上,OpenGL相关库已经包含在Windows SDK里了。
项目中链接opengl32.lib库,并包含相关头文件使用:

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

窗口管理

窗口操作在每个系统上都是不一样的,OpenGL 有目的地将这些操作抽象(Abstract)出去。
这意味着我们不得不自己处理创建窗口,定义 OpenGL 上下文以及处理用户输入。
幸运的是,有一些库已经提供了我们所需的功能。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。

glut

GLUT - The OpenGL Utility Toolkit

所有 glut 的库函数均以 glut 开头,主要包括窗口操作函数,窗口初始化、窗口大小、窗口位置等函数;回调函数:响应刷新消息、键盘消息、鼠标消息、定时器函数等;创建复杂的三维物体;菜单函数;程序运行函数。

但是版本太老了,理应被时代淘汰,不推荐使用。gult 最后版本 v3.7beta 的历史可追溯至 1998 年 8月,且该项目已经被废弃。它的许可证禁止任何人发布修改后的库代码。

freeglut

FreeGLUT

gult 对应的开源实现,完全兼容 glut,是 glut 的代替品,开源,功能齐全。

glfw

GLFW - Graphics Library Framework

lightweight轻量化的 OpenGL 框架,一个头文件,很少量的 API,就完成了窗口管理。glfw 的开发目的是用于替代 glut 的,从代码和功能上来看,它已经完全的完成了任务。它是一个轻量级的,开源的,跨平台的library。支持 OpenGL 及 OpenGL ES,用来管理窗口,读取输入,处理事件等。

freeglut与glfw的区别
最大的区别是,在处理用户输入上,FreeGLUT主要通过回调函数(Callback
function),而GLFW则提供了两种输入机制即回调函数与轮询(polling)。

在回调函数方式 中,用户提供给GLFW的回调函数用来处理用户输入操作如键盘按键或鼠标操作。

当用户按下或者松开按键时,它都会被触发,包括一些特殊的键位(例如 Shift、Caps Lock、Esc等)。

而在轮询方式中,程序可以直接查询系统中是否已经按下了任意键,或者更具体一点,是否按下了某个特定的键。

它允许用户直接获取某个按键的瞬时状态,相当于用户直接询问:“这个键现在被按下了吗?”

回调函数与轮询这两种方式的最大差别,轮询方式能连续获得键盘输入,而回调函数则适用于按键速度不是特别快,不需要连续效果(比如人物不停地跑),具体可参考这篇文章。

另外,freeglut支持创建右键菜单,而GLFW不支持。

GLFW在输入机制上提供了更多选择,同时也增加了复杂性。

而freeglut则相对较为简单,因此如果从学习OpenGL与图形学的角度来看,freeglut不失为一个合适的选择。而如果对程序的连续性输入要求较高时,则可以考虑GLFW。

函数加载

OpenGL 只是一个标准/规范,具体的实现是驱动开发商针对特定显卡实现的。
由于 OpenGL 驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。
所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。
这个过程非常复杂,而且很繁琐,需要对每个可能使用的函数都要重复这个过程。幸运的是,有些库能简化此过程。

是对底层OpenGL接口的封装,可以让代码跨平台。

glew

GLEW - The OpenGL Extension Wrangler Library

前面已经说过openGL的实现是显卡生产商,那么系统如何才能找到这些实现好的函数呢?而且不同的平台函数存放地方还不同,文件结构也不同。有没有一种方式能够自动找到OpenGL的函数?这就是glew的作用:用来找openGL的函数,并初始化,这样我们就能直接调用OpenGL的函数了。

GLAD

glad是继gl3w,glew之后,当前最新的用来访问OpenGL规范接口的第三方库。简单说glad是glew的升级版。

GLAD是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们需要初始化GLAD。GLAD也可以使OpenGL基础渲染变得简单。

https://glad.dav1d.de/
选择对应的OpenGL版本和Core模式下载。
include目录添加进VS工程的附加包含目录。
src目录中的glad.c文件需要添加进项目目录。

#include <glad/glad.h>

需要注意的是

  • 要先包含glad后包含glfw

    #include <glad/glad.h>
    #include <GLFW/glfw3.h> 
    
  • MFC程序中添加glad.c时不能用预编译头。
    因为 .cpp 项目且添加了glad.c文件后,项目中混合了 .cpp 和 .c文件,由于编译器对它们采取不同的编译方式因此出错。因而不能共用一个预编译头文件。在 VC++ 中,默认的预编译头文件是针对 C++ 的(stdafx.h 和 stdafx.cpp)。
    如果要使用预编译头文件,可以将glad.c改为glad.cpp并添加#include "stdafx.h"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/917211.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI写作(十)发展趋势与展望(10/10)

一、AI 写作的崛起之势 在当今科技飞速发展的时代&#xff0c;AI 写作如同一颗耀眼的新星&#xff0c;迅速崛起并在多个领域展现出强大的力量。 随着人工智能技术的不断进步&#xff0c;AI 写作在内容创作领域发挥着越来越重要的作用。据统计&#xff0c;目前已有众多企业开始…

ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言 本篇文章介绍的是ROS高效进阶内容&#xff0c;使用URDF 语言&#xff08;xml格式&#xff09;做一个差速轮式机器人模型&#xff0c;并使用URDF的增强版xacro&#xff0c;对机器人模型文件进行二次优化。 差速轮式机器人&#xff1a;两轮差速底盘由两个动力轮位于底盘左…

Java 网络编程(二)—— TCP流套接字编程

TCP 和 UDP 的区别 在传输层&#xff0c;TCP 协议是有连接的&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 而UDP 协议是无连接的&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有连接和无连接的区别是在进行网络通信的时候&#xff0c;…

YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

Python调用API翻译Excel中的英语句子并回填数据

一、问题描述 最近遇到一个把Excel表中两列单元格中的文本读取&#xff0c;然后翻译&#xff0c;再重新回填到单元格中的案例。大约有700多行&#xff0c;1400多个句子&#xff0c;一个个手动复制粘贴要花费不少时间&#xff0c;而且极易出错。这时&#xff0c;我们就可以请出…

虚拟化数据恢复—ESX SERVER共享的STORAGE中分区表被清零的数据恢复案例

虚拟化数据恢复环境&故障&#xff1a; 某单位信息管理平台&#xff0c;数台VMware ESX SERVER共享一台某品牌DS4100存储。 vc报告虚拟磁盘丢失&#xff0c;管理员ssh到ESX中执行fdisk -l查看磁盘&#xff0c;发现STORAGE中的分区表不见了。重启所有设备后&#xff0c;ESX S…

无效的目标发行版17和无法连接Maven进程问题

起因&#xff1a;我clean了一个模块的Maven想要重新下&#xff0c;他就开始报错。两次了都是这样。如果和我一样一开始都是好好的&#xff0c;直接找Maven的设置&#xff0c;在运行程序改&#xff0c;jre变成了11.它自己变成了我其他的jdk

在Docker环境下为Nginx配置HTTPS

前言 配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS&#xff0c;使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书&#xff0c;但在开发测试或内网环境中&#xff0c;自签名证书是一个很好的选择。 …

英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2

我们介绍的 NV-Embed-v2 是一种通用嵌入模型&#xff0c;它在大规模文本嵌入基准&#xff08;MTEB 基准&#xff09;&#xff08;截至 2024 年 8 月 30 日&#xff09;的 56 项文本嵌入任务中以 72.31 的高分排名第一。此外&#xff0c;它还在检索子类别中排名第一&#xff08;…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

SOP搭建:企业标准化操作程序构建与实施指南

一、引言 在当今充满竞争的商业领域&#xff0c;实现企业运营的标准化、高效化和高质量化是提升企业市场竞争力的关键所在。标准操作程序&#xff08;SOP&#xff09;作为一种至关重要的管理工具&#xff0c;能够清晰地阐述业务流程&#xff0c;规范操作行为&#xff0c;并促进…

【每日刷题】Day156

【每日刷题】Day156 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1020. 飞地的数量 - 力扣(LeetCode) 2. 1765. 地图中的最高点 - 力扣(LeetCode) 3. 1162. 地图分…

J.U.C - 深入解读Condition条件变量原理源码

文章目录 Pre概述Condition 主要方法Condition案例Condition的源码解析1. 等待&#xff1a;condition. await2. 唤醒Condition. signal Condition总结 Pre J.U.C - 深入解析ReentrantLock原理&源码 概述 配合synchronized同步锁在同步代码块中调用加锁对象notify和wait方…

c++ 类和对象(中)

前言 我们看看下面的代码以及代码运行结果 代码1 我们可以看到在我们的类Data中的函数成员print中&#xff0c;我们并没有设置形参&#xff0c;在调用此函数时&#xff0c;也并没有多余传参&#xff0c;但是我们调用它时&#xff0c;却能准确打印出我们的_year、_month、_day…

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中&#xff0c;同时也能够启动 Google Chrome 浏览器并打开扩展页面&#xff0c;自动执行一些操作。 C:\pythoncode\new\crxiterationtaburl.py 全部代码…

使用Web Components构建模块化Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件&#xff0c;可以在应用中添加消息推送功能&#xff0c;向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图&#xff1a; 一、登录极光官网 进入【服务中心】-【开发者平台】 创建应用&#xff1a;【概览】- 【创…