OpenGL--入门基础

一、图形API简介

1.OpenGL

Open Graphics Library,是一个跨平台的应用程序编程接口(API),用于渲染2D、3D矢量图形的跨语言,拥有功能强大、调用方便的底层图形库,将计算机的资源抽象为OpenGL对象,对这些对象的操作形成一套OpenGL指令。多用于CAD、虚拟实境、科学可视化程序和电子游戏开发。

2.OpenGL ES

OpenGL for Embedded Systems,是OpenGL三维图形API的子集,针对手机、PDA和游戏主机等嵌入式设备而设计,在移动端应用广泛。去除了不必要和性能较低的API接口。

如应用需要图形的绘制及渲染时,它会通过OpenGL ES框架,向CPU传输响应绘制指令,GPU收到指令后进行相应的操作,最终将结果在屏幕上绘制出来。

3.DirectX

是由微软开发的多媒体编程接口,由C++语言编写,广泛应用于Windows平台,而且不支持Windows以外的平台。DirectX由很多API组成,按照性质分类,可以分为四部分:显示部分、声音部分、输入部分和网络部分。

显示部分:是图形处理的关键,主要负责2D图形加速与3D效果的展示。

声音部分:主要负责播放和处理声音,另外还加强了3D音效及录音功能等。

输入部分:支持多种输入设备,保证这些设备进行正常工作。

网络部分:主要为了具有网络功能的游戏而开发,提供多种连接方式,保证用户通过网络连接进行对战,此外也提供了网络对话及保密功能。

4.Metal

Apple专门为游戏开发者退出的新平台技术,能够为3D图像提高10倍的渲染性能,并支持众多游戏引擎及公司。是一种低层次的渲染应用程序编程接口,提供了软件所需的最底层,保证软件可以运行在不同的图形芯片上。

二、图形API应用场景

游戏开发中,对游戏场景、游戏人物的渲染;

音视频开发中,对视频解码后的数据渲染,对视频添加滤镜效果;

地图引擎开发中,对地图上的数据渲染;

动画中实现动画的绘制。

三、图形图像开发专有名词

上下文context

应用程序调用任何OpenGL指令,都需要首先创建一个上下文,该上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,也是OpenGL指令执行的基础。

OpenGL不管在哪个语言中,都是类似C语言一样的面向过程的函数,本质上都是对OpenGL这个状态机中的某个状态或对象执行的操作。

由于OpenGl上下文是一个庞大的状态机,所以切换上下文往往会产生较大的开销,而不同的绘制模块,需要使用完全独立的状态管理。因此可以在程序中分别创建多个不同的context,在不同的线程中使用不同的context,context之间可以共享纹理、缓冲区等资源。这样避免了反复切换context,程序运行更加合理高效。

OpenGL状态机

状态机描述了一个对象在其生命周期内所经历的各种状态、状态间的转变、转变的动因和条件、转变中执行的活动等。或者说状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列及对那些状态事件的响应。具有以下特点:

OpenGL可以记录自己的状态,如当前使用的颜色、是否开启了混合功能等;OpenGL可以接收输入,根据输入内容和自己原先状态,修改自己当前状态,并可以有对应输出;OpenGL可以进入停止状态,不再接收输入,停止工作。

渲染Rendering

将图形/图像数据转换为3D控件图像的操作叫做渲染。

顶点数组与顶点缓冲区

OpenGL中的图像都是由图元组成的,有3中类型的图元:点、线、三角形。为方便开发者调用,将这些图元数据形成集合,称为顶点数组。同时为了提高性能,提前分配一块显存,负责存取这些顶点数组,这部分显存就被称为顶点缓冲区。

管线

在OpenGl中渲染图形,会经历一个个操作节点,这一些列的操作可称为管线。管线是一个抽象的概念。

固定管线

在早期的OpenGl版本中,封装了多种功能固定的着色器程序块,控制着光照、坐标变换、裁剪、纹理混合等诸多功能,帮助开发者完成图形的渲染,而开发者只需要传入固定的参数即可。这类程序块称为固定管线。

但是由于OpenGL使用场景非常丰富,固定管线无法完成每一个需求,这时就需要可编程管线。

可编程管线

顾名思义,管线中的某些环节可以被控制,我们可以通过GPU中的着色器进行自定义编程,来控制、管理加速卡的渲染效果。可以使用GLSL语言自己编程,如顶点着色器和片元着色器。

总结:当程序完全使用默认的着色器程序时,这个流水线就叫做固定管线;我们对着色器进行自定义编程时,这个流水线就叫做可编程管线。

着色器程序Shader

OpenGl在处理shader时,和其它编译器一样,通过编译、链接等步骤,生成各种着色器程序。使用这些着色器程序完成图形图像的渲染绘制。

顶点着色器

用来计算顶点属性的程序,用来处理图形每一个顶点的变换,如旋转、平移、投影等。顶点着色器是逐顶点运算的,也就是每个顶点数据都会执行一次顶点着色器,而且是并行执行。另外顶点着色器运算过程中无法访问其他顶点数据。

片元着色器

用来处理图形中每个像素点颜色的计算和填充。片元着色器逐像素运算的,即每个像素都会执行一次片元着色器,当然也是并行的。

GLSL

OpenGL Shading LanguageOpenGL中各种着色器都是使用该语言编写的小型函数,GLSL是构成所有OpenGL着色器的语言,运行在GPU上。

光栅化

把顶点数据转换为光栅化片元的过程,片元中的每一个元素对应于帧缓冲区中的一个像素。光栅化实际上是一种将几何图元变为二位图像的过程,将模拟信号转化为离散信号的过程。包含两部分工作,第一:决定窗口坐标中哪些整形栅格区域被基本图元占用;第二:分配一个颜色值和一个深度值到各个区域。

纹理

可以理解为图片,在渲染图形时,为了场景更加逼真,我们可以为其编码填充图片,该图片就是纹理。

混合:从OpenGL流程上来说,混合就是将帧缓存中已有的颜色与输入的片元颜色进行混合计算,使用OpenGl指定的算法进行计算;从图形绘制角度来说,混合就是上层图片的颜色与下层图片的颜色的合成。

变换矩阵

用于图形平移、缩放、旋转的矩阵称为变换矩阵。

投影矩阵

用于将3D坐标转换为二维屏幕坐标的矩阵。

渲染上屏/交换缓冲区

渲染缓冲区一般映射的是系统的资源,比如窗口。如果将图像直接渲染到窗口对应的渲染缓冲区,则可以将图像显示到屏幕上,该操作称为渲染上屏。

但是,如果每个窗口只有一个缓冲区,那么在绘制过程中屏幕进行了刷新,窗口可能显示不完整图像。为了解决这个问题,常规的OpenGL程序至少会有两个缓冲区,显示在屏幕上的屏幕缓冲区和未显示的离屏缓冲区。在一个缓冲区渲染完成后,将屏幕缓冲区与离屏缓冲区进行交换,实现图像在屏幕上的显示,该操作称为交换缓冲区。

坐标系

2D笛卡尔坐标系:由一个X轴和一个Y轴组成,X轴表示水平方向,Y轴表示垂直方向,X轴与Y轴相互垂直。

3D笛卡尔坐标系:在2D笛卡尔坐标系基础上多了一个Z轴,Z轴同时垂直于X轴与Y轴,代表三维物体的深度。

坐标系详细内容可阅读我的另一篇文章:OpenGL--坐标系详解

视口

就是窗口中用来显示图形的一块矩形区域,可以和窗口等大,也可以比窗口大或者小。只有绘制在视口区域中的图形才能被显示,超出视口的部分图形是看不到的。

投影方式

正投影:又叫平行投影,特点就是无论物体距离摄像机多远,投影后的物体大小尺寸不变。该投影的视景体是一个矩形的平行管道,及长方体。常用语建筑图绘制、计算机辅助设计等行业,这些行业要求投影后的物体尺寸与角度不变,以方便施工制造。

透视投影:特点是离视点近的物体大,离视点远的物体小,远到极限变消失,称为灭点。该投影视景体类似一个顶部与底部都被切除掉的棱锥。常用语动画、视觉仿真等行业。

四、着色器渲染流程

在OpenGl进行绘制的时候,首先由顶点着色器对传入的顶点数据进行运算;再通过图元装配(图元设置)将顶点转换为图元;然后进行光栅化,将图元这种矢量图形转换为栅格化数据(片元数据);最后将栅格化数据传入片元着色器进行运算,对栅格化数据中的每个像素进行运算,并决定像素的颜色及深度值等。

                                                                         图1:着色器渲染流程

1.顶点着色:对顶点数据进行计算操作,确定其位置、颜色及其它属性。

2.细分着色:使用两个细分控制着色器和细分计算着色器来分别管理Patch数据,并产生最终的形状。该着色阶段可选。

3.几何着色:光栅化之前对几何图元进行进一步处理,如创建新的图元。该着色阶段可选。

4.图元设置:将顶点及相关集合图元组织起来,准备下一步剪切操作。

5.剪切:顶点可能落在视口之外,此时需要对图元数据进行调整(剪切),保证像素不会在视口之外绘制。

6.光栅化:将图元数据生成对应的片元,作为一个候选的像素,即可以放置在帧缓存(fragment)中的的像素,供后边操作使用。

7.片元着色:计算数据片元的最终颜色和深度值等数据,最终将片元数据显示在屏幕上。

8.逐步元操作:该阶段使用深度测试、模板测试来决定一个片元是否可见。

注:对于每个OpenGL程序,顶点着色器与片元着色器是必须使用的,其它着色器可选择性使用。

 

思考:顶点着色与片元着色区别?

    顶点着色决定一个图元在屏幕的位置;片元着色决定片元的颜色及深度。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JeffersonGO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值