1.OpenGL基本概念和名词解释

[TOC]

OpenGL简介

是一种对图形硬件设备特性进行访问、与硬件无关的接口,用来开发计算机图形应用。本身不提供三维物体模型、读取文件的操作。

OpenGL是使用CS结构实现的,我们编写的应用程序可以看做客户端,计算机图形硬件厂商所提供的OpenGL实现是服务端。OpenGL的某些实现允许服务端和客户端在一个网络内的不同计算机上运行。这种情况,客户端负责提交OpenGL的命令,服务端最终执行并产生图像内容。

名词解释

渲染

表示计算机从模型创建最终图像的过程。OpenGL是基于光栅化的系统,除此以外还有其他渲染系统,例如光线追踪系统。

图元(Primitives)

基本图形元素, 点、线、三角形等。

OpenGL有三种基本图元,点、线、三角形。

几何顶点被组合为图元(点,线段或多边形),然后图元被合成片元,最后片元被转换为帧缓存中的象素数据。

片元(Fragments)

图元被分几步转换为片元:图元被适当的裁剪,颜色和纹理数据也相应作出必要的调整,相关的坐标被转换为窗口坐标。最后,光栅化将裁剪好的图元转换为片元。

着色器

它是图形硬件设备所执行的一类特殊函数。理解着色器的最好方法是把它看做转为图形处理单元(GPU)编译的一种小型程序。OpenGL内部包含了所有的编译器工具,可以直接从着色器源代码创建GPU所需的编译代码并执行。

帧缓存

计算机图形硬件设备管理的一块独立内存区域,可以直接映射到最终的显示设备上。

函数命名规则

以gl开头

glUniform2f

传入2个参数值,参数类型为GLFloat

glUniform2fv

v代表vector,传入一个一维的GLFloat数组,包含2个浮点数值

渲染管线(Rendering Pipeline)

可参考一篇文章搞懂到底什么是渲染流水线

数据传输到OpenGL(VBO、VAO)

Vertex Buffer/Array Objects, 是cpu提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息。

定义这样的顶点数据以后,我们会把它作为输入发送给图形渲染管线的第一个处理阶段:顶点着色器。它会在GPU上创建内存用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡。顶点着色器接着会处理我们在内存中指定数量的顶点。

我们通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。

顶点着色

通常来说,一个复杂的应用程序可能包含多个顶点着色器,但是在同一时刻只能有一个顶点着色器起作用

细分着色(可选)

几何着色(可选)

图元装配 Primitive Assembly

顶点着色器下一个阶段是图元装配,图元(prmitive)是三角形、直线或者点精灵等几何对象。这个阶段,把顶点着色器输出的顶点组合成图元。

裁剪和剪切

顶点可能会落在视口(ViewPort)之外,此时和顶点相关的图元会做出改动,以保证相关的像素不会在视口外绘制。

光栅化

将更新的图元传递到光栅化单元,生成对对应的片元。

光栅化的工作是判断某一部分几何体(点、线、三角形)所覆盖的屏幕空间,得到了屏幕空间信息以及输入的顶点数据之后,光栅化单元就可以直接对片元着色器中的每个可变变量进行线性插值。(用于从分配给每个图元顶点的顶点着色器输出生成每个片段值的机制称作插值(Interpolation)。)然后将结果值传递给片元着色器。

可以将片元理解为“候选像素”,也就是可以放置在帧缓存中的像素,但是它也可能被最终删除。

光栅化意味着片元生命周期的开始

片元着色

片元着色器的计算这个片元的最终颜色。可以进行纹理映射对颜色进行补充,也可以丢弃某个片元,终止而这个片元的处理。

逐片元操作

最后的独立片元处理过程,这个阶段进行深度测试(depth test,或者z缓存)和模板测试(stencil test)来决定片元是否可见。

如果片元通过所有激活测试,它可以被直接绘制到帧缓存中,它对应的像素的颜色值会被更新,如果开启了融混(blending)模式,片元的颜色会和该像素当前的颜色叠加,形成新的颜色值并写入帧缓存中。