OpenGL入门教程之 深入理解

一、OpenGL简介

  • OpenGL是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程规范
  • OpenGL包含一系列可以操作图形和图像的函数,但OpenGL没有实现这些函数,OpenGL仅规定每个函数应该如何执行以及其输出值(类似接口),所以OpenGL仅是一种严格的规范
  • OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定。实际的OpenGL库的开发者通常是显卡的生产商
  • OpenGL被设计为只有输出的,所以它只提供渲染功能。核心API没有窗口系统、音频、打印、键盘/鼠标或其他输入设备的概念。虽然这一开始看起来像是一种限制,但它允许进行渲染的代码完全独立于他运行的操作系统,所以OpenGL允许跨平台开发
  • OpenGL没有提供着色器编译器,而是由显卡驱动来完成着色器的编译工作,也就是说,只要显卡驱动支持对GLSL的编译它就能运行,所以OpenGL能够跨平台
  • 核心模式与立即渲染模式:
    早期OpenGL使用立即渲染(Immediate mode,也就是固定渲染管线)容易使用和理解,但是效率太低。从OpenGL3.2开始废弃立即渲染模式,鼓励使用核心模式(Core-profile)。
    核心模式:要求使用者真正理解OpenGL和图形编程,有一些难度,然而提供了更多的灵活性,更高的效率,可以更深入理解图形编程。
  • 扩展:
    OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
  • 状态机:
    OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染
  • 对象:
    OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个
    使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可

二、OpenGL程序

 众所周知程序是运行在CPU上的,程序代码处于内存之中,在我们通常的理念中一般仅涉及CPU和内存,而使用OpenGL的渲染程序却有所不同,其涉及了GPU和显存,如下图所示:
在这里插入图片描述

从内存到显存

  • 我们的程序运行在CPU上,程序的数据储存在内存之中
  • 当我们需要渲染一个场景时,可能需要场景中物体的一些顶点数据、纹理数据、着色器参数等。这些数据是我们程序指定的,它们最初存储于外存中,当我们程序在CPU运行时我们将它们读入内存中
  • 显卡中有显存,这个缓冲区可以存储图形缓冲、深度缓存、纹理、顶点缓存等一系列渲染场景所需要的数据。利用这些数据,执行GPU的渲染指令,即可渲染我们想要的场景。
  • 那么问题来了,我们如何将内存中的数据传输到显存呢?
  • 毫无疑问这一切的答案都在OpenGL中,通过OpenGL有关函数,我们运行在CPU上的程序可以向显存中发送数据,将渲染场景所需的数据存储于显卡的显存缓冲区中

OpenGL渲染状态机

  • 当渲染所需数据已经传输到显存中时,我们如何执行GPU的渲染命令呢?
  • GPU的渲染指令是非常底层的,涉及显卡类型等硬件参数,这样复杂的指令让我们去调用是不可能的。但是我们有OpenGL。
  • 渲染是一套固定的流程,我们无法对接GPU的底层指令,那我们是否可以建立一个通用的、无关硬件的渲染模型呢?当然可以,这就是OpenGL。
  • 渲染是一个流程,这个过程中拥有很多可设置的选项,我们称这些选项为OpenGL的状态。所谓状态机,即拥有众多参数作为状态,当在不同的状态情况下会做出不同的反应,例如在不同的场景选项下呈现出不同的渲染结果。
  • OpenGL是一个完整的渲染状态机,Khronos组织制定并维护了OpenGL,换句话说:他们建立了OpenGL的状态机模型。这个模型是用于渲染的,它包含很多参数作为状态。针对这个模型,Khronos组织制定了OpenGL应该包含的函数,这些函数包括一些状态设置函数(State-changing Function)和状态应用函数(State-using Function)。使用状态设置函数可以改变OpenGL上下文即OpenGL的状态,使用状态应用函数会根据当前OpenGL的状态执行一些操作。
  • 如简介所说,OpenGL只是一个规范并没有具体的函数实现。如上文所说,OpenGL只是一个包含许多状态的渲染模型,其制定了一整套渲染所需的函数规范。那么我们如何搭建起OpenGL这个数学模型和GPU底层渲染指令间的桥梁呢?即OpenGL制定的函数该由谁实现呢?这通常是显卡开发商该思考的,显卡开发商针对OpenGL模型规范开发出具体显卡的OpenGL驱动程序,即在特定的OpenGL的状态下,显卡会执行特定的渲染指令
  • 如此一来,我们只需要和OpenGL这个通用的、和硬件无关的状态机进行交互,即可执行出我们所需的GPU渲染指令。而程序和OpenGL的交互无非是改变OpenGL的状态,例如设置OpenGL的选项,或操作缓冲区、或执行渲染操作。

三、GLFW和GLEW

 书接上文,OpenGL只提供渲染功能,核心API中没有创建窗口、键盘监听等输入概念,那么我们要进行渲染,肯定要把渲染后的画面呈现的电脑的窗口上,这该怎么办呢?
 使用GLFW即可,GLFW是一个跨平台的OpenGL应用框架,支持窗口创建,接受输入和事件等功能其成员以GLFW形式开头
 上文中提到扩展,当我们想要使用一个OpenGL函数时,需要查询当前平台是否支持这个函数,并且返回这个函数的指针。这毫无疑问是一件非常麻烦的事情,那么有什么方便的途径吗?
 使用GLEW即可,GLEW是一个基于OpenGL图形接口的跨平台的C++扩展库GLEW能自动识别当前平台所支持的全部OpenGL高级扩展涵数。只要包含glew.h头文件,就能使gl,glu,glext,wgl,glx的全部函数。GLEW支持目前流行的各种操作系统。其成员常常以gl开头。

四、其他

 本文参考并引用参考文章内容。
 本文内容仅为个人在OpenGL学习中的感想,如有不当之处请不吝赐教。

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

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

相关文章

基于JSP的网上购物系统的设计与实现(论文+源码)_kaic

摘 要 近些年来,社会的生产力和科技水平在不断提高,互联网技术也在不断更新升级,网络在人们的日常生活中扮演着一个重要角色,它极大地方便了人们的生活。为了让人们实现不用出门就能逛街购物,网络购物逐渐兴起慢慢变得…

新一代AI带来更大想象空间!上海将打造元宇宙超级场景!

引子 上海市经信委主任吴金城4月12日在“2023上海民生访谈”节目表示,上海将着力建设元宇宙智慧医院、前滩东体元宇宙、张江数字孪生未来之城等元宇宙超级场景。 吴金城说,新一代人工智能将带来更大的想象空间。比如,人工智能和元宇宙数字人的…

ESP32设备驱动-SHT20温湿度传感器驱动

SHT20温湿度传感器驱动 文章目录 SHT20温湿度传感器驱动1、SHT20介绍2、硬件准备3、软件准备4、驱动实现1、SHT20介绍 Sensirion 的 SHT20 湿度和温度传感器已成为外形尺寸和智能方面的行业标准:嵌入在 3 x 3mm 封装和 1.1mm 高度的可回流焊双扁平无引线 (DFN) 封装中,它提供…

项目人力资源管理

相关概念 组织结构图:用图形表示项目汇报关系。最常用的有层次结构图、矩阵图、文本格式的角色描述等3种。 任务分配矩阵(或称责任分配矩阵)(RAM):用来表示需要完成的工作由哪个团队成员负责的矩阵,或需要完成的工作与哪个团队成员有关的矩阵。 一、规划人力资源管理(编…

动力节点Vue笔记——Vue与Ajax

四、Vue与AJAX 4.1 回顾发送AJAX异步请求的方式 发送AJAX异步请求的常见方式包括: 原生方式,使用浏览器内置的JS对象XMLHttpRequest const xhr new XMLHttpRequest()xhr.onreadystatechange function(){}xhr.open()xhr.send() 原生方式&#xff0…

zabbix客户端配置

一、zabbix客户端配置 1.实验环境:关闭防火墙和安全模块 systemctl disable --now firewalld setenforce 0 2.服务端和客户端都要时间同步 yum install -y ntpdate #注意安装需要用网络源安装,不能用本地源 ntpda…

google账号注册流程升级了!2023年谷歌gmail邮箱帐号注册申请教程(完整版)

google账号注册升级了! 2023年4月份google账号注册流程升级了,升级之前的版本是完成验证手机号码后才填写用户资料,升级之后的版本是需要先填写用户资料才能注册谷歌gmail邮箱帐号; 2023年谷歌gmail邮箱帐号注册申请教程 1、打开…

电子器件系列34:tvs二极管(2)

一、基本原理: 二、重要产数: 不同的资料对于相同的参数可能有不同的命名,要根据实际情况来确定参数的意义 这里以上图表格里的参数名称进行解析,以其他资料作为参考。 结合图表和伏安特性曲线,再结合下面的图我是…

这才是后端API该有的样子

一般系统大致架构如下: 有些小伙伴会说,这个架构太简单太low了吧,什么网关、缓存、消息中间件都没有。 需要说明的是,因为我们主题是API接口(tbAPI,pinduoduo API接口调用)所以聚焦这一点上就行…

Linux命令·ping

Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性,我们经常会说“ping一下某机器,看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送ICMP ECHO_REQUEST数据包到网络主机&#xff08…

【小程序】django笔记2

templates路径除了在settings中的templates的DIR[]中申明还有什么别的方法? 已知,django底层根据app注册顺序查找各app文件中的templates文件夹,在其中搜索目标模版文件。 已知,app注册在settings中的INSTAll-APPS里。 已知&#…

C++ 缺省参数 函数重载 引用

缺省参数,我们先看一下什么是缺省参数 首先,这个是我们的需要传参的函数,这里我们传入 1 然后就输出 a 下面我们就看一下缺省参数 我们现在看main函数里面调用fun函数,这里会输出多少呢? OK 这里我们分别输出了0 和 1…

【2023】cookie是什么?有什么用?一篇文章彻底搞懂cookie

一个不大不小的问题 假设服务器有一个接口,通过请求这个接口,可以添加一个管理员 但是,不是任何人都有权力做这种操作的 那么服务器如何知道请求接口的人是有权力的呢? 答案是:只有登录过的管理员才能做这种操作 …

SpringCloud之OpenFeign介绍案例+相关面试题

概述 OpenFeign是一个声明式的WEB服务客户端,它使WEB服务客户端变得更加容易。具有可插拔的注解支持,SpringCloud中添加了SpringMVC注解的支持。SpringCloud中集成了Ribbon和Eureka,以及SpringCloud LoadBalance,以便在使用Feign时…

pyest+appium实现APP自动化测试,思路全总结在这里

目录 01、appium环境搭建 2、搭建pythonpytestappium环境 3、安装pycharm搭建项目编写脚本 4、执行测试 绵薄之力 01、appium环境搭建 安装nodejs http://nodejs.cn/ 为什么要安装nodejs? 因为appium这个工具的服务端是由nodejs语言开发的 安装jdk&#xf…

mysql数据库简介

1.什么是数据库:数据仓库。访问必须只能用SQL语句来访问。数据库也是一个文件的系统。 2.数据库的作用:存储数据的作用。开发任何的应用,都有数据库。 3.关系型的数据库:数据库中保存的都是实体与实体之间的关系。 4.常见的数据库…

2023接口自动化测试,完整入门篇

1. 什么是接口测试 顾名思义,接口测试是对系统或组件之间的接口进行测试,主要是校验数据的交换,传递和控制管理过程,以及相互逻辑依赖关系。其中接口协议分为HTTP,WebService,Dubbo,Thrift,Socket等类型,测试类型又主…

stata绘图指令

stata绘图指令 – 潘登同学的stata笔记 文章目录 stata绘图指令 -- 潘登同学的stata笔记 绘图概览韦恩图折线图连线图线性拟合图直方图 函数图添加特殊字符和文字 绘图概览 Stata 提供的图形种类: twoway 二维图scatter 散点图line 折线图area 区域图lfit 线性拟合…

基于单片机的温室大棚环境监测系统设计

温室大棚对北方反季节蔬菜的种植具有重要意义。据了解全国各地温室大棚使用集中,但是大棚环境调控方式落后、管理落后、生产效率比较低。针对此问题本文提出了一种基于STM32单片机智能温室大棚控制系统方案,实现环境参数的自动检测,以达到智能…

2023年股票代持行业研究报告

第一章 股票代持概述 1.1 基本概念 股票代持,或称委托持股,是指实际出资人与名义出资人达成以下约定:名义出资人作为名义股东,在股东名册等公司工商登记信息上出现,而实际上由实际出资人出资并享有投资权益。 股票代…