【OpenGL】OpenGL简介

news2024/11/22 17:34:31

文章目录

  • 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

https://glad.dav1d.de/

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-24-一篇文章彻底掌握Python HTTP库Requests

python-24-一篇文章彻底掌握Python HTTP库Requests 一.简介 在 Python 中&#xff0c;Requests 是一个非常流行且易于使用的 Python HTTP 库&#xff0c;专门用于发送 HTTP/HTTPS 请求&#xff0c;获取请求响应&#xff1b; 可能觉得HTTP请求不是应该前端去做么&#xff1f;…

SpringMVC案例学习(一)--计算器设计登录页面设计

文章目录 1.计算器1.1.html代码1.2接口设计1.3前端测试1.4接口测试 2.登录页面设计2.1接口实现2.2查看前端页面效果2.3未进行前后端交互时候的代码2.4前后端交互设计2.5个人实践遇到的问题 3.lombok介绍3.1插件安装3.2导入依赖 1.计算器 1.1.html代码 下面的这个就是我们的前…

【Linux 麒麟系统 qt 程序通过root启动 桌面程序】

通过.desktop pkexec 启动程序 关键字方案一方案二第一步 修改.desktop第二步 xxx.sh实现 注意 关键字 pkexec .desktop qt 原始需求&#xff1a; 用户在麒麟系统上通过快捷方式(.desktop)启动程序后绑定系统的26端口&#xff0c;但是因为系统权限问题&#xff0c;26端口普通…

DevOps-Gitlab-私有代码仓库

1. 概述 1. 私有代码仓库 2. 精细化权限配置,让系统更安全 3. 控制用户/用户组是否可以提交到主分支 (PR Push Request) 4. 它使用Ruby语言写成。后来&#xff0c;一些部分用Go语言重写 2. Gitlab vs Github/Gitee GitlabGithub/Gitee共同点存放代码,git访问存放代码,git访问…

【AI声音克隆整合包及教程】第二代GPT-SoVITS V2:技术、应用与伦理思考

一、引言 在当今科技迅速发展的时代&#xff0c;声音克隆技术成为人工智能领域的一个备受瞩目的分支。GPT-SoVITS V2作为一种声音克隆工具&#xff0c;正逐渐进入人们的视野&#xff0c;它在多个领域展现出巨大的潜力&#xff0c;同时也引发了一系列值得深入探讨的问题。本文旨…

重新认识HTTPS

一. 什么是 HTTPS HTTP 由于是明文传输&#xff0c;所谓的明文&#xff0c;就是说客户端与服务端通信的信息都是肉眼可见的&#xff0c;随意使用一个抓包工具都可以截获通信的内容。 所以安全上存在以下三个风险&#xff1a; 窃听风险&#xff0c;比如通信链路上可以获取通信…

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先&#xff0c;确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板&#xff1a; npm init vitelatest进入项目目录 创建完成后&#xff0c;进入项目目录&#xff1a; cd vue3-demo启动…

Three.js 搭建3D隧道监测

Three.js 搭建3D隧道监测 Three.js 基础元素场景scene相机carema网络模型Mesh光源light渲染器renderer控制器controls 实现3d隧道监测基础实现道路实现隧道实现多个摄像头点击模型进行属性操作实现点击模型发光效果 性能监视器stats引入使用 总结完整代码 我们将通过three.js技…

【学术会议介绍,SPIE 出版】第四届计算机图形学、人工智能与数据处理国际学术会议 (ICCAID 2024,12月13-15日)

第四届计算机图形学、人工智能与数据处理国际学术会议 2024 4th International Conference on Computer Graphics, Artificial Intelligence and Data Processing (ICCAID 2024) 重要信息 大会官网&#xff1a;www.iccaid.net 大会时间&#xff1a;2024年12月13-15日 大会地…

VScode C++配置opencv4.5.3——先赞后看,配置成功实属不易-(镜像加速环境w版和配置文件版)

前置准备&#xff1a;配置MinGW和CMake 手把手教——class1_VScode配置C环境_linux vscode cpp配置-CSDN博客文章浏览阅读398次&#xff0c;点赞4次&#xff0c;收藏6次。点击Windows x64 Installer:下载msi文件 安装完成后验证。配置gcc文件下bin环境。最后ctrlF5运行尝试。W…

机器学习 笔记

特征值提取 字典 from sklearn.extaction import DictVectorizer mDictVectorizer(sparseFalse)#sparse是否转换成三元组形式 data[], #传入字典数据 data1model.fit_transform(data) #使用API 英文特征值提取 from sklearn.feature_extraction.text import CountVe…

推荐一款好用的postman替代工具2024

Apifox 是国内团队自主研发的 API 文档、API 调试、API Mock、API 自动化测试一体化协作平台&#xff0c;是非常好的一款 postman 替代工具。 它通过一套系统、一份数据&#xff0c;解决多个系统之间的数据同步问题。只要定义好接口文档&#xff0c;接口调试、数据 Mock、接口…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…

requests库如何处理 - POST请求常见的两种请求体格式:表单格式JSON格式

目录&#xff1a; 每篇前言&#xff1a;一、POST请求的两种常见请求体格式详解1. 表单格式&#xff08;form-encoded&#xff09; - 举例&#xff1a;福州搜索示例代码&#xff08;表单数据&#xff09;&#xff1a; 2. JSON格式 - 举例&#xff1a;CSDN搜索示例代码&#xff0…

HCIP-HarmonyOS Application Developer 习题(二十二)

1、用户将手机导航迁移至智能手表之后&#xff0c;智能手表如果需要获取手机传过来的数据&#xff0c;从下列哪个方法中获取? A、onCompleteContinuation() B、onStartContinuation() C、onRestoreData() D、onSaveData() 答案&#xff1a;C 分析&#xff1a;FA发起迁移后&am…

LLMs之Code:Github Spark的简介、安装和使用方法、案例应用之详细攻略

LLMs之Code&#xff1a;Github Spark的简介、安装和使用方法、案例应用之详细攻略 目录 Github Spark的简介 Github Spark的安装和使用方法 1、安装 2、使用方法 Github Spark的案例应用 Github Spark的简介 2024年10月30日&#xff0c;GitHub 重磅发布GitHub Spark 是一…

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…

HMSC联合物种分布模型在群落生态学中的贝叶斯统计分析

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

【AI技术对电商的影响】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…