OpenGL专有名词解析(夹杂通俗举例和个人理解)

2019-05-11  本文已影响0人  lb_

万丈高楼平地起,OpenGL中专有名词对初学者来说是入门阶段较为晦涩难懂的主要原因之一,但却是我们必须要反复推敲理解,融会贯通的重要部分。本文针对OpenGL以及图形渲染中一些专有名词进行解析,加入了一些自己的理解(本文暂不针对OpenGL具体函数/API)。

一、OpenGL状态机

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

【举例】通俗的说,例如一个电视机,我们打开后,电视机开始播放。播放的状态则会持续,下一次再按,就是关闭。而当电视机处于关闭状态时,我们切换频道,加减声音都是无效的。因为不再接受数据。OpenGL既是如此,当我需要混合的时候,开启混合->计算混合色值->绘制->关闭混合。是一个完整的流程,如果我们开启了不关闭,OpenGL会一直记录混合开启状态。这也是我们在OpenGL中见到很多状态切换语句 ,最典型像什么glEnable ,glDisable, 还有就是设置语句. glTexImage2d, glBindXXX, glUseProgram 等.. 抽象来说它里面就是一堆参数在来回切换来切换去.
而事实上如何切换也是一门学问,切不好 绘制结果出现问题,而且很影响效率。

二、OpenGL上下文【context】

使用glut创建上下文示例:

glutInitContextVersion(3,3);
glutInitContextProfile(GLUT_CORE_PROFILE);
//glutInitContextFlags(GLUT_FORWARD_COMPATIBLE);  //设置forward compatibility

三、渲染

四、顶点缓冲区/顶点数组对象(VBO/VAO)

顶点的概念我就不多赘述了,那么顶点缓冲区呢?

  1. 显示列表可以快速简单地优化立即模式(glBegin/glEnd)的代码。在最坏的情况下,显示列表的命令被预编译存到命令缓冲区中,然后发送给图形硬件。在最好的情况下,是编译后放在图形硬件中以减少传输的带宽。显示列表的优化根据实现的不同而有所不同,而且显示列表一旦被创建就不可以修改,灵活性差。

  2. 顶点数组提供了我们想要的灵活性,最坏的结果不过是把数据块复制给硬件而已(比立即模式快的多)。而索引顶点数组可以减少向硬件传输的顶点数据的数量,减少变换的开销。
    OpenGL提供了一个特性对图形的吞吐量进行终极的控制。当我们使用顶点数组时,可以把单个数组从客户内存(CPU可以访问)传输到图形硬件。这个特性称为顶点缓冲区对象,允许我们按照类似于管理纹理的方式来管理顶点数组数据,而且顶点缓冲区对象要更灵活。

简单的来说:
OpenGL3.0之前的设置顶点方法,在glBegin和glEnd之间使用。已经废弃此方法。每个glVertex与GPU进行一次通信,十分低效。

glBegin(GL_TRIANGLES);
    glVertex(0, 0);
    glVertex(1, 1);
    glVertex(2, 2);
glEnd();

而VBO/VAO是CPU提供给GPU的顶点信息,包括了顶点的位置、颜色(只是顶点的颜色,和纹理的颜色无关)、纹理坐标(用于纹理贴图)等顶点信息,减少了与GPU通讯,加快效率。
这里推荐一篇博客,关于这个问题讲解的很详细。
http://www.cnblogs.com/BigFeng/p/5117311.html

五、管线 Graphics Pipeline

管线总结为:顶点数据(Vertices) > 顶点着色器(Vertex Shader) > 图元装配(Assembly) > 几何着色器(Geometry Shader) > 光栅化(Rasterization) > 片断着色器(Fragment Shader) > 逐片断处理(Per-Fragment Operations) > 帧缓冲(FrameBuffer)。再经过双缓冲的交换(SwapBuffer),渲染内容就显示到了屏幕上。而管线指的就是这个流程,一般这个流程我们在OpenGL中使用ShaderManager来管理。
OpenGL中有两种管线:

六、顶点着色器Vertex Shader和片元(片段/像素)着色器Fragment Shader

先通俗理解他们是干啥的。

顶点着色器一般用来处理每个顶点变换(旋转,平移,投影等),顶点着色器是OpenGL中用来处理计算顶点属性的程序
片元着色器是OpenGL中用于计算片段,即每一个像素颜色的程序,参考上图(简单介绍那张图)也就是说每个像素都会执行一次片元着色器。
(叫做程序比较好关联理解因为可编程管线中我们可以自己修改计算逻辑。也就是GLSL,下面这条会将)

七、GLSL(OpenGL Shading Language)

OpenGL着色语言是用来在OpenGL中着色编程的语言,开发者可自己编写以代替固定管线流程的一部分,既是可编程管线。GLSL分为顶点着色器和片元着色器两个部分。

GLSL其使用C语言作为基础高阶着色语言,避免了使用汇编语言或硬件规格语言的复杂性。

八、光栅化Rasterize/Rasteriztion

光栅化(像素化)是把已有的顶点数据转化为片元的过程,具有将图像转化为一个个格栅组成的图像的作用。特点是每个元素对应帧缓冲区中的一个像素。

通俗理解就是把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。
如下图,这是一个放大了1200%的屏幕,前面是告诉计算机我有一个圆形,后面就是计算机把圆形转换成可以显示的像素点。这个过程就是Rasterize。

Rasteriztion做了什么

九、纹理

纹理可以理解为图片,图像渲染时经常需要填充图片。这里的图片其实就是纹理,在OpenGL中,我们更喜欢称之为纹理 。

十、混合(Blending,Blend)

十一、变换矩阵

OpenGL中视图变化通常有两种方式:

(本文非转载,如转载请标明来源,谢谢)

上一篇 下一篇

猜你喜欢

热点阅读