音视频面经_音视频知识解析:第七章 OpenGL基础知识

本专栏会持续更新优质内容,敬请订阅,关注更新。

专栏地址:音视频面经_音视频知识解析

------------下面正文开始-------------

第七章 OpenGL

1 简介

OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来绘制从简单的图形到比较复杂的三维景象。而另一种程序接口系统是仅用于Microsoft Windows上的Direct3D。OpenGL常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。

OpenGL的高效实现(利用了图形加速硬件)存在于Windows,部分UNIX平台和Mac OS。这些实现一般由显示设备厂商提供,而且非常依赖于该厂商提供的硬件。开放源代码库Mesa是一个纯基于软件的图形API,它的代码兼容于OpenGL。但是,由于许可证的原因,它只声称是一个“非常相似”的API。

当今,OpenGL是视频行业领域中用于处理2D/3D图形的最为广泛接纳的API,在此基础上,为了用于计算机视觉技术的研究,从而催生了各种计算机平台上的应用功能以及设备上的许多应用程序。其是独立于视窗操作系统以及操作系统平台,可以进行多种不同领域的开发和内容创作,简而言之,其帮助研发人员能够实现PC、工作站、超级计算机以及各种工控机等硬件设备上实现高性能、对于视觉要求极高的高视觉图形处理软件的开发。

1.1 OpenGL的特性

以下是对 OpenGL 的一些主要特性的概述:

1. 低层次的渲染 API:OpenGL 提供了直接与图形硬件进行交互的能力。这使得它非常强大,因为它可以充分利用图形处理器(GPU)的性能。然而,这也意味着使用 OpenGL 需要对计算机图形学有深入的理解。

2. 状态机:OpenGL 是一个状态机,这意味着你可以通过一系列的函数调用来改变它的内部状态,然后这些状态会影响后续的渲染操作。

3. 可扩展性:OpenGL 的一个重要特性是它的可扩展性。硬件制造商可以为他们的硬件特性定义新的 OpenGL 函数和参数。这些扩展可以通过 OpenGL 的扩展机制被查询和使用。

4. 跨平台和跨语言:OpenGL核心是一个C库,可以在所有主要的操作系统(如 Windows、macOS 和 Linux)上运行,并且有各种编程语言的绑定,包括 C、C++、Python、Java 和许多其他语言。

5. 显示列表和着色器:OpenGL 提供了两种主要的方式来指定如何渲染图形。一种是通过使用显示列表来指定一系列的顶点和参数。另一种是通过使用着色器,这是一种在 GPU 上运行的小程序,可以控制图形的最终颜色和位置。

总的来说,OpenGL 是一个非常强大的工具,能够为开发者提供创建高性能、高质量图形的能力。尽管它可能需要一些时间来学习,但是它在许多领域中都被认为是一个重要的技能。

1.2 OpenGL 的工作流程

OpenGL 的工作流程大致可以分为以下几个步骤:

1. 定义图形数据:首先,你需要定义你要渲染的图形数据,这些数据主要包括顶点数据。例如,如果你要渲染一个三角形,你就需要定义三个顶点的坐标。这些数据通常存储在顶点缓冲对象(Vertex Buffer Object,VBO)中。

2. 定义着色器程序:着色器是运行在图形处理器(GPU)上的小程序,用于控制图形的渲染过程。最常见的着色器类型有顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。顶点着色器用于处理顶点数据,片元着色器用于计算像素的颜色。

3. 渲染图形:在图形数据和着色器程序都准备好之后,你可以调用 OpenGL 的函数来渲染图形。在渲染过程中,OpenGL 会根据你设置的状态和着色器程序来处理顶点数据,生成图形,并将图形绘制到一个叫做帧缓冲(Frame Buffer)的内存区域。

4. 显示图形:最后,你可以将帧缓冲的内容显示到屏幕上。这通常是通过交换前后帧缓冲(在双缓冲模式下)或者直接复制帧缓冲的内容到屏幕上完成的。

需要注意的是,OpenGL 只负责渲染图形,它并不包含创建窗口、处理用户输入等功能。这些功能通常需要通过其他的库(如 GLFW、SDL 等)来实现。

1.3 OpenGL 的基本组件,包括顶点、坐标、颜色、纹理等

OpenGL 通过一系列的基本组件和概念来定义和渲染 3D 图形。下面是其中的一些基本组件:

1. 顶点(Vertex):顶点是构成图形的基本元素。一个顶点主要包含位置信息,但也可能包含颜色、法线、纹理坐标等其他信息。在 OpenGL 中,顶点数据通常存储在顶点缓冲对象(VBO)中,并通过顶点数组对象(VAO)来管理。

2. 坐标(Coordinates):OpenGL 使用坐标来描述顶点的位置。在 3D 空间中,每个顶点都有一个三维坐标(x, y, z)。在 OpenGL 中,所有的坐标都被归一化到一个叫做裁剪空间(Clip Space)的立方体中,这个立方体的中心位于原点,长度、宽度和高度都是 2。

3. 颜色(Color):颜色用于描述顶点或者片元的颜色。在 OpenGL 中,颜色通常由红、绿、蓝三个分量来表示,每个分量的值在 0 到 1 之间。有时候还会有一个额外的分量 alpha,用于表示颜色的透明度。

4. 纹理(Texture):纹理是一个图像,可以被映射到图形的表面上,增加图形的细节。每个顶点都可以有一个或多个纹理坐标,用于指定纹理的哪一部分应该被映射到顶点上。在 OpenGL 中,纹理数据通常存储在纹理对象中。

5. 着色器(Shader):着色器是运行在 GPU 上的小程序,用于控制图形的渲染过程。顶点着色器(Vertex Shader)用于处理顶点数据,片元着色器(Fragment Shader)用于计算像素的颜色。

6. 帧缓冲(Frame Buffer):帧缓冲是一个内存区域,用于存储渲染的结果。在渲染过程中,OpenGL 会将图形绘制到帧缓冲中。帧缓冲中的数据最终可以被复制到屏幕上,或者被保存为图像文件。

以上就是 OpenGL 的一些基本组件,理解这些组件和概念是学习和使用 OpenGL 的基础。

本专栏会持续更新优质内容,敬请订阅,关注更新。

专栏地址:音视频面经_音视频知识解析

音视频面经_音视频知识解析 文章被收录于专栏

本人在CVTE从事音视频开发工作多年,推出该专栏的目的是帮助更多有意向从事音视频开发的同学了解音视频编解码等基本知识、熟悉FFmpeg、SDL、OpenGL等开源框架的使用和编程,并动手开发视频播放器。 这些都是目前大厂音视频开发工程师相关职位要求的必备技能。本专栏会持续更新优质内容,敬请订阅,关注更新。随着内容不断丰富,可能会做付费专栏。另外提供CVTE内推、职位信息、面试答疑

全部评论
点赞、订阅后,可在评论区留言领取资料和源码工程
点赞 回复 分享
发布于 06-21 15:50 广东
专栏地址:音视频面经_音视频知识解析
点赞 回复 分享
发布于 06-21 15:50 广东
本专栏会持续更新优质内容,敬请订阅,关注更新。
点赞 回复 分享
发布于 06-21 15:50 广东
点赞 回复 分享
发布于 06-21 15:50 广东
点赞 回复 分享
发布于 06-21 15:54 广东
音视频开发中OpenGL需要学习到什么程度大佬,掌握哪些知识呢
点赞 回复 分享
发布于 06-23 11:40 陕西
讲的很简单还收培训费==
点赞 回复 分享
发布于 08-11 22:06 广东

相关推荐

11-06 12:10
已编辑
中南大学 Unity3D客户端
图形开发时间线TimeLine:9.21投-10.17笔试-10.24一面-11.1二面-11.5hr面已经是还在流程的几家里唯一的大厂了,球球收了孩子叭,牛客许愿会灵吗,会的吧?总之,先发个一面面经涨涨人品,后续秋招结束会发总结篇,里面有鼠鼠为数不多的十来场面试的面经,以及一堆的笔经(总之就是非常惨)(83min)- 自我介绍- 平时怎么学习图形学?看过Unity,UE源码没有?- 说说C++的共享指针?- weak_ptr是怎么工作的?- shared_ptr是线程安全的吗?- 构造函数可以是虚函数吗?- 虚函数机制?- 虚函数表什么时候构建的?存在哪?- 虚函数表怎么构建的?内存空间连续吗?- 虚函数表除了虚函数地址还存了别的其他什么东西吗?- 如果一个基类函数不标明为virtual,子类重写了这个函数,那指向子类对象的基类指针调用该函数会发生什么?- 只有纯虚函数的类有虚函数表吗?- 子类不实现纯虚函数会怎么样?在什么时候会报错?会报什么错?- 说说vector的扩容机制?- 说说list的实现?- 如何高效的查找有序的list里的元素?- list二分查找的复杂度是多少?(O(n),我当时没想出来)- 如果考虑空间换时间,时间复杂度可以是多少?(这里脑子抽了,我说分别存储每一次list二分之后的结果,存储在vector里,然后二分的时候只需要比较尾节点,然后转移到对应的list里进行下一步查询, 事后感觉应该是想引导我说,把list用vector存一遍,然后在vector上做二分)- 说说优先队列的实现?- 堆是怎么实现的?插入数据的时间复杂度是多少?- 插入的逻辑是怎样的?- 你的渲染引擎是怎么考虑跨平台的?- 你写的shader是怎样在目标平台运作的?- shader里你是怎样采样贴图的?讲讲API的使用?- textureLod怎么用?- 如果不提供level,GPU怎么知道要采样哪一层的Mipmap呢?(通过贴图uv在屏幕上的变化率决定)- 你刚刚说的u对x,v对y的偏导里的x和y是什么坐标?- 除了这个坐标空间还有哪些坐标空间?- 三线性插值是怎么做的?- 讲讲OpenGL的一个渲染管线?- 顶点的裁剪坐标空间坐标怎么得到的?- 后续会被怎样处理?- NDC标准空间的xyz取值是多少?- 锯齿是怎么形成的?在哪个阶段生成的?- 有哪些抗锯齿手段?- MSAA和FXAA有什么区别?- MSAA的硬件实现是怎么做的?- FXAA怎么做的?- 实时阴影你怎么做的?- 点光源的阴影要怎么实现?- 只能是生成CubeMap吗?不能生成Texture2D吗?(傻了,忘记CubeMap可以展开在一个Texture2D上或者干脆用柱状投影图了,我说你非要搞那就整一个Texture2DArray)- 你实现BVH的目的是什么?- 视锥剔除有必要吗?不是裁剪阶段也会做剔除?- 平时渲染方面怎么Debug?- 如何优化shader的效率?- 为什么尽量不要写if/else语句?那什么时候能用呢?- 减少采样操作?怎么减少?哪些采样操作可以移到CPU做?- 如果必须要采样呢?怎样做优化?以PCSS为例?- 为什么尽量少做那些复杂的数学运算?反三角函数,矩阵的逆什么的?- 线程和协程的区别?(太久没看真忘了,支支吾吾嗯是说不出啊,早知道直接说不知道了)- 那线程和进程的区别呢?- 反问?  - 图形开发工程师隶属于什么部门?引擎部?中台?(统一校招,进去之后再细分,可能进项目组可能进中台)  - 这个职位入职的培训和游戏开发那边的培训有什么区别?(差不多也是miniGame,内容上可能区别比较大)  - 可以知道具体的工作室吗?(进去之后双选)  - 如果我想胜任图形开发工程师这个岗位,需要再巩固加强哪些方面?(被说计算机基础不牢固了,奶奶滴,我就那个协程没说好嘛!(ㄒoㄒ)) #网易# #网易互娱# #游戏开发# #许愿# #时间线# #一面#
查看55道真题和解析
点赞 评论 收藏
分享
评论
2
8
分享
牛客网
牛客企业服务