OpenGL是什么,opencl不可用怎么解决

2024-05-1104:44:49综合资讯0

图形 API 简介
图形 API(应用程序编程接口)充当软件和图形硬件之间的桥梁,提供了对系统的底层图形功能的控制。以下是流行的图形 API:
- OpenGL(开放图形库):一个跨平台、跨语言的图形 API,将计算机资源抽象为 OpenGL 对象,并提供操作它们的指令。
- OpenGL ES(嵌入式系统 OpenGL):OpenGL 的一个子集,专门设计用于移动设备、PDA 和游戏机等嵌入式系统。它舍弃了旧式的低效内存复制操作,以支持更新、更优化的技术。
- DirectX:一个由 Microsoft 开发的 API 集合,包括负责图形处理的 Direct3D。DirectX 并不是一个纯粹的图形 API,而是 Windows 系统上一个通用的多媒体处理框架,不支持其他平台。
- Metal:Apple 为游戏开发者提供的平台技术,可将 3D 图像的渲染性能提升高达 10 倍。Metal 是 Apple 为解决 3D 渲染而开发的框架。
图形 API 的功能
图形 API 的主要功能是执行图形的底层渲染,包括:
- 游戏开发中的游戏场景和角色渲染
- 音视频开发中解码视频数据的渲染
- 地图引擎中地图数据的渲染
- 动画中的动画绘制
- 视频处理中的滤镜效果应用
OpenGL 术语注释
- GPU(图形处理单元):图形卡上用于处理图形数据的可编程芯片。它具有极高的并行性,能够以极快的速度处理几何、颜色、光照和其他数据,生成屏幕图像。
- 渲染:将数学和图形数据转换为 3D 空间图像的过程。由于屏幕只有 2D,渲染技巧在于创建一种图像,让眼睛产生看到缺失的第 3 维的错觉。
- 像素:计算机屏幕上的图像由矩形的颜色点组成,称为像素。单个像素由三个颜色元素组成:红色、绿色和蓝色。
- 缓存:OpenGL ES 定义了在两个内存区域之间交换数据的缓存概念。缓存是指图形处理器可以控制和管理的连续 RAM。
程序会将数据从 CPU 的内存复制到 OpenGL ES 的缓存中。一旦 GPU 获得对缓存的所有权,运行在 CPU 中的程序通常不再访问该缓存。通过控制独占的缓存,GPU 能够以最高效率读取和写入内存。图形处理器可以同时处理缓存中的大量数据,这意味着在 GPU 使用缓存中的数据时,运行在 CPU 中的程序可以继续执行。

  • OpenGL Context(上下文):OpenGL上下文(Context)用于将配置OpenGL的信息保存在特定平台的软件数据结构中。这些信息被封装到OpenGL上下文中。OpenGL是一个状态机,这意味着一旦在程序中设置了一个配置值,该值将保持不变,直到程序修改它。切换上下文通常会带来较大的开销,但不同的绘图模块可能需要使用完全独立的状态管理。可以在应用程序中分别创建多个不同的上下文,在不同的线程中使用不同的上下文,这些上下文之间可以共享纹理、缓冲区等资源。这种方案比反复切换上下文或频繁修改渲染状态更加合理和高效。
  • OpenGL状态机
  1. 状态机是一个抽象的模型,表示一组状态变量的集合。每个状态变量可以具有各种不同的值,也可以仅打开或关闭等。当我们在OpenGL中进行绘图时,每次指定所有这些变量显然是不切实际的。相反,OpenGL使用一种状态模型(也称为状态机)来跟踪所有OpenGL状态变量。一旦设置了状态值,它将保持不变,直到其他函数对其进行修改为止。许多状态只能简单地打开或关闭。例如,深度测试要么打开,要么关闭。
  2. OpenGL能够记录自己的状态(例如:当前使用的颜色、是否启用混合功能等),这些状态需要被记录。
  3. OpenGL能够接收输入(当我们调用OpenGL函数时,实际上可以将其视为OpenGL接收我们的输入),根据输入内容和自身状态进行状态修改,并且能够产生输出(例如我们调用glColor3f,OpenGL接收到这个输入后会修改自身的“当前颜色”状态;我们调用glRectf,则OpenGL会输出一个矩形)。
  4. OpenGL可以进入停止状态,不再接收输入。尽管这在我们的程序中可能不太明显,但在程序退出之前,OpenGL总会先停止工作。
  • 顶点(空间中的一个位置):在2D和3D中,当我们绘制一个物体时,实际上是用一些更小的称为图元(Primitives)的形状来组成这个物体。图元是一维或二维的实体或表面,如点、直线和多边形(平面多边形的形状)。在3D空间中,我们将图元组合在一起创建3D物体。例如,一个三维立方体由6个正方形组成,每个正方形代表一个独立的面。正方形(以及其他任何图元)的每个角称为顶点(Vertex)。这些顶点在3D空间中指定了特定的坐标。顶点实际上就是2D或3D空间中的一个坐标。
  • 顶点数组:顶点(Vertex)是坐标空间中的一个点。顶点数组是存储一个图形的所有顶点数据的一段缓存。
  • 管线
  • OpenGL的模型类似于一个生产线或管道。数据在这个模型中通常是单向流动的,数据通过我们的程序调用的命令进入管线的起点,然后流经一个一个阶段,直到到达管线的末端。
  • OpenGL通过连接多个称为着色器的小程序并辅以固定功能函数作为“胶水”来工作。当我们绘图时,图形处理器执行我们的着色器,并将它们的输入输出在管线中串联起来,直到像素完成并到达管线末端。
  • 固定管线/可编程着色器
  • 在早期的OpenGL版本中,它封装了一个包含了光照、坐标变换、裁剪等多种功能的固定shader程序块,以帮助开发者完成图形渲染,开发者只需要传入相应的参数,就能快速完成图形的渲染。
  • 但是由于OpenGL的使用场景非常丰富,固定管线或存储着色器无法满足每一个业务需求。相关部分被开放为可编程。
  • 着色器程序shader
  • 全面将固定渲染管线架构变为可编程渲染管线。在实际调用绘制函数之前,OpenGL需要指定一个由shader编译成的着色器程序。常见的着色器主要包括顶点着色器(Vertex Shader)、片段着色器(Fragment Shader)/像素着色器(Pixel Shader)、几何着色器(Geometry Shader)和曲面细分着色器(Tessellation Shader)。片段着色器和像素着色器只是在OpenGL和DX中的不同叫法而已。不幸的是,直到OpenGL ES 3.0,仍然只支持了顶点着色器和片段着色器这两个最基础的着色器。
  • OpenGL在处理Shader时,类

    3D 笛卡尔坐标系

    将 2D 笛卡尔坐标系中的 x 轴、y 轴新增一个表示深度分量的 z 轴,就得到了 3D 笛卡尔坐标系。

    视口

    视口是窗口内部用于绘制裁剪区域的客户区域。视口将裁剪区域简单地映射到窗口中的一个区域。通常,视口会被定义为整个窗口,但这并不是严格必须的。

    有时,我们可能只想在窗口的一部分进行绘图。我们可以使用视口来缩小和放大窗口中的图像,还可以通过把视口设置大于窗口的用户区域,从而只显示裁剪区域的一部分。

    投影方式

    首先需要理解投影:把 3D 几何图形的坐标数据投影在一个 2D 平面。就好像用笔在玻璃上描摹出玻璃后面的物体的外形。而平面上的投影就是视景体。通过指定投影,我们可以指定在窗口中显示的视景体。

    opengl是什么

    正投影

    正投影又叫平行投影。使用这种投影时,需要指定一个正方形或长方形的视景体。视景体之外的任何物体都不会被绘制。而且,所有实际大小相同的物体在屏幕上都具有相同的大小,不管它们是远是近。

    我们还可以在正投影中通过指定远、近、左、右、顶和底裁剪平面来指定视景体。在这个视景体中出现的物体和图形将被投影( 考虑它们的方向)到一个在屏幕上出现的 2D 图像。

    透视投影

    在透视投影中,远处的物体看上去比近处的物体更小一些。它的视景体看上去有点像一个顶部被削平的金字塔。剩下来的这个形状称为平截头体( Frustum)。靠近视景体前面的物体看上去比较接近它们的原始大小。当靠近视景体后部的物体被投影到视景体的前部时,它们看上去就显得比较小。在模拟和 3D 动画中,这种投影能够获得最大程度的逼真感。

    <img data-image_ids="[]" image_type="1" img_height="728" img_width="924" mime_type="image/webp" src="https://p6-sign.toutiaoimg.com/pgc-image/6a48116f528e4dc8b764f54a34a8fe1b~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1715183276&x-signature=PPH9VHh5R1NZOCsZ5JRJuCCalls%3D" web_uri="pgc-image/6a48116f528e4dc8b