OpenGL入门教程之 深入理解

news2024/11/23 16:39:49

一、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的状态机模型。这个模型是用于渲染的,它包含很多参数作为状态。当我们执行渲染时,我们改变了OpenGL的状态,以至于OpenGL调用了GPU的底层渲染指令,使得我们能在显卡上看到我们需要渲染的场景。
  • 如简介所说,OpenGL只是一个规范并没有具体的函数实现。如上文所说,OpenGL是一个包含许多状态的渲染模型。那么我们如何搭建起OpenGL这个数学模型和GPU底层渲染指令间的桥梁呢?即针对OpenGL模型的不同状态,GPU该执行哪些渲染命令呢?这通常是显卡开发商该思考的,显卡开发商针对OpenGL模型规范开发出具体显卡的OpenGL驱动程序,即在特定的OpenGL的状态下,显卡会执行特定的渲染指令
  • 如此一来,我们只需要和OpenGL这个通用的、和硬件无关的状态机进行交互,即可执行我们所需的GPU渲染指令。而程序和OpenGL的交互无非是改变OpenGL的状态,例如设置OpenGL的选项,或者操作缓冲区。

三、其他

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

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

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

相关文章

Excel技能之计数求和,让你成为高手之路的机车手

Excel高手之路,开始学习就看到希望。 直接套用,秒变Excel大神。点滴积累,效率飞升。分享给更多的人,一起学习进步。告别加班,让同事刮目相看。 Excel函数,你可以不用,但是不能不知道&#xff…

OpenAI-ChatGPT最新官方接口《安全最佳实例》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(十)(附源码)

Safety best practices 安全最佳实践 前言Use our free Moderation API 使用我们的免费审核APIAdversarial testing 对抗性测试Human in the loop (HITL) 人在回路Prompt engineering 快速工程“Know your customer” (KYC) “了解你的客户”Constrain user input and limit ou…

【Vue3】setup的注意点及watch监视属性的六种情况

一,setup须知 1.1setup的执行时间 1.setup的执行时间要比beforCreate执行要早 export default {name: "Demo",beforeCreate(){console.log(beforeCreate已执行);},setup() {console.log(setup已执行);let person reactive({name: "小明",ag…

Faster RCNN系列——RPN的真值详解与损失值计算

目录 一、RPN真值详解二、RPN预测值三、损失值计算 一、RPN真值详解 RPN的真值分为类别真值和偏移量真值,即每一个Anchor是否对应着真实物体,以及每一个Anchor对应物体的真实偏移值,这两种真值的具体求解过程如下图所示: Anchor生…

【小程序云开发】不用后端也能构建完整的微信小程序

文章目录 什么是微信小程序云函数云数据库HTTP 云函数定时触发云函数总结写在最后 什么是微信小程序云函数 微信小程序云函数是通过微信小程序云开发提供的一种服务器端代码,用于在小程序中进行服务器端的开发和部署。 以下是一些常见的微信小程序云函数类型&#…

AI网站汇总(免费chatgpt)(70个持续增加中)

本文总结了八大类AI工具,包括:聊天AI、绘画AI、AI提示词、图像处理、实用工具、UI设计和3D设计、本地部署AI,汇总AI网站,一键收藏。 目录 一、聊天AI 二、绘画AI 三、AI提示词 四、图像处理

巡检机器人之仪表识别系统

作者主页:爱笑的男孩。 博客简介:分享机器学习、深度学习、python相关内容、日常BUG解决方法及Windows&Linux实践小技巧。 如发现文章有误,麻烦请指出,我会及时去纠正。有其他需要可以私信我或者发我邮箱:zhilong666foxmail.c…

什么是LVS

😘作者简介:一名99年运维岗位员工。👊宣言:人生就是B(birth)和D(death)之间的C(choise),做好每一个选择。🙏创作不易,动动…

【brtc】视频下行弱网对抗优化 学习笔记

感谢孙健老师和livevideostack学习笔记百度云 音视频实时通信五个部分 1 RTC基础 需要云端服务器参与大量边缘服务器参与采集、前处理(图像处理)、压缩编码音频 3 A 回声消除、增益</

类ChatGPT逐行代码解读(1/2):如何从零起步实现Transformer、ChatGLM

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

深度学习竞赛进阶技巧 - BLIP使用说明与实战

BLIP-2: 图像到文本的生成器 BLIP-2: Scalable Pre-training of Multimodal Foundation Models for the World’s First Open-source Multimodal Chatbot 1论文摘要 由于大规模模型的端到端的训练&#xff0c;视觉与语言的预训练模型的成本越来越高。本文提出了BLIP-2&#x…

网络原理(IP协议)

目录IP协议IP地址IP 地址由网络和主机两部分标识组成IP 地址的分类广播地址IP多播子网掩码路由IP 地址与路由控制IP 分包与组包什么是IP分片为什么要进行IP分片IP分片是如何组装的路径 MTU 发现IP协议 IP&#xff08;IPv4、IPv6&#xff09;相当于 OSI 参考模型中的第3层——网…

玩转ChatGPT:Auto-GPT项目部署与测评

一、Auto-GPT简介 最近&#xff0c;以ChatGPT为代表的超大规模语言模型火出了圈&#xff0c;各种二次开发项目也是层出不穷。 这周在AI圈炸街的是Auto-ChatGPT&#xff0c;在GitHub上已经61.4K的点赞了。 项目地址&#xff1a;https://github.com/Torantulino/Auto-GPT 用项…

命令设计模式(Command Pattern)[论点:概念、组成角色、相关图示、示例代码、框架中的运用、适用场景]

文章目录概念组成角色相关图示示例代码框架中的运用适用场景概念 命令设计模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;它将请求的操作封装为一个对象&#xff0c;从而实现请求者和执行者之间的解耦。这样&#xff0c;请求者只需要知道如何发送…

Darknet19详细原理(含tensorflow版源码)

Darknet19原理 Darknet19是一个轻量级的卷积神经网络&#xff0c;用于图像分类和检测任务。 它是YOLOv2目标检测算法的主干网络&#xff0c;它的优点在于具有较少的参数和计算量&#xff0c;在计算速度和精度之间取得了良好的平衡&#xff0c;同时在训练过程中也具有较高的准确…

MobileNetV1详细原理(含torch源码)

目录 MobileNetV1原理 MobileNet V1的网络结构如下&#xff1a; 为什么要设计MobileNet&#xff1a; MobileNetV1的主要特点如下&#xff1a; MobileNetV1的创新点&#xff1a; MobileNetV1源码&#xff08;torch版&#xff09; 训练10个epoch的效果 MobileNetV1原理 Mo…

玩转ChatGPT:中科院ChatGPT Academic项目部署与测评

一、ChatGPT Academic简介 最近&#xff0c;以ChatGPT为代表的超大规模语言模型火出了圈&#xff0c;各种二次开发项目也是层出不穷。 比如说今天我们玩弄的这个“ChatGPT Academic”&#xff0c;在GitHub上已经13.7K的点赞了。 项目地址&#xff1a;https://github.com/bina…

因为这5大工具,同事直呼我时间管理小王子

写在前面 关于时间管理、如何做计划、如何提高执行力等等相关话题其实很早之前我就想写了&#xff0c;但一直拖着迟迟没有动笔。 在之前的一篇文章里我曾详细聊过自己对于时间管理&#xff0c;如何提高执行力&#xff0c;以及如何摆脱那种没有灵魂的任务计划的一些思考和做法…

【C语言】深度理解指针(中)

前言✈ 上回说到&#xff0c;我们学习了一些与指针相关的数据类型&#xff0c;如指针数组&#xff0c;数组指针&#xff0c;函数指针等等&#xff0c;我们还学习了转移表的基本概念&#xff0c;学会了如何利用转移表来实现一个简易计算器。详情请点击传送门&#xff1a;【C语言…

Windows 下安装和使用Redis

Redis 一般安装在Linux中&#xff0c; 但有时出于学习和其他目的&#xff0c;需要在Windows机器运行Redis&#xff0c; 本篇介绍如果在&#xff37;indows中运行和使用Redis。 关于Redis的基本介绍可以参考&#xff1a; Redis介绍、安装与初体验 Windows 下Redis的下载 可…