初识OpenGL

什么是OpenGL

OpenGL是一套可以对计算机图形硬件设备(GPU)进行访问的API。主要用于渲染2D/3D矢量图形。OpenGL以两种形式存在,第一种形式是“OpenGL标准/规范”,定义了行业标准。第二种是OpenGL实现,开发者可以使用它的API。

OpenGL工具包

OpenGL只是负责渲染操作,所以还需要配合渲染之外的库使用,例如图形界面、键盘、鼠标事件等交互操作。

  • glut/glfw是主要用于构建图形界面(GUI)的库。glut适用于练习,glfw支持Linux和Windows。
  • GLEW/glad是实现了OpenGL API的封装,最重要的就是可以跨平台。GLAD可以看做GLEW的升级。
  • GLTools是一个工具类库默认包含了GLEW库,包含了用于矩阵操作、和向量的3D数学库等。

OpenGL专业名词

OpenGL上下文(context)/状态机(state machine)

  • 在启动OpenGL的程序前需要启动OpenGL的上下文,OpenGL需要初始化它的上下文,上下文实际就是状态机(state machine),它表示一组状态变量的集合,使用状态机追踪状态变量的变化,当一个变量被设置后就一直保持这个状态,直到有函数改变了当前状态。
  • 如果有vue、react、flutter等经验就可以很好理解,启动程序后,如果state中的变量发生变化,那么就会重新渲染界面,不需要我们手动去刷新页面
  • OpenGL中的变量可能在CPU或者GPU所控制的内存中,会按需要在两个内存之间复制信息。
  • 如果需要绘制多个模型,可以创建多个Opengl上下文,它们相互独立,可以共享数据。减少因频繁切换上下文带来的消耗。

渲染

渲染是一个将集合图形、颜色、灯光、和其它数据转换成2D空间的操作,简单说就是3D图形到2D图形的过程。

顶点数组

  • 顶点:空间中的一个点,坐标表示为(x,y,z,w),分别表示长、宽、深度、缩放比例。主要在内存中。顶点主要是绘制图形的骨架。
  • 顶点缓冲区:GPU内存中分配给顶点数组的空间。

渲染管线

  • 它是一系列数据处理过程,将数据转换成最终渲染的图像。就像手机工厂根据各种配件最后组装成手机的一条流水线。


    管线.png

上图是渲染管线的大致流程

  1. 顶点着色器,用来处理顶点相关的数据。
  2. 细分着色器(可选):使用面片来描述一个物体的形状,使用简单的面片增加几何图元的数量,模型的外观会更为平顺
  3. 几何着色器(可选):改变管线中的图元类型和数量。
  4. 图元装配:将顶点着色器处理后的顶点转换成图元,一般有点、直线、三角形
  5. 剪切:在渲染区域(视口)之外的顶点不会被渲染,所以这部分会被剪裁。
  6. 光栅化:把图元映射为最终屏幕上相应的像素(未被染色的像素点),生成供片元着色器使用的片元。两个过程:决定窗口坐标中的哪些栅格区域被基本图元占用(确定在像素中的范围),二是分一个颜色值和一个深度值。
  7. 片元着色:使用片元着色器来计算每个像素点的最终颜色,并填充

固定管线

固定管线是系统提供好的,只需要我们调用就行。

可编程管线

可编程管线中的顶点着色器和片元着色分别代替了固定管线上的各顶点的操作和片元处理。需要使用OpenGL提供glsl语言编写程序。

着色器

着色器(Shader)是运行在GPU上的小程序。这些小程序为图形渲染管线的某个特定部分而运行(顶点着色器、片元着色器等)。OpenGL中有很多着色器,允许自定义的只有顶点着色器和片元着色器。

1.顶点着色器

用来处理顶点相关的数据。1.确定位置。2.缩放/平移/旋转等

2.片元着色器

计算每个像素点的最终颜色,并填充。

纹理

纹理可以简单的理解为图片,它是用来保存图像颜色元素值的缓存。硬件设备获取图片后需要对图片进行解压生成位图,而位图是有一个个像素点组成的,每个像素都是一个个RGBA数据。图片中的像素变成了纹理中的一个纹素,纹素保存着每个RGA数据。

混合

在测试阶段之后,如果像素依然没有被剔除,那么像素的颜⾊将会和帧缓冲区中颜⾊附着上的颜⾊进⾏混合,混合的算法可以通过OpenGL的函数进⾏指定。但是OpenGL提供的混合算法是有限的,如果需要更加复杂的混合算法,⼀般可以通过像素着⾊器进⾏实现,当然性能会⽐原⽣的混合算法差⼀些。

变换矩阵

变换矩阵可以对图形进行平移、缩放、旋转

投影矩阵

用于将3D坐标转换为二维屏幕坐标

渲染上屏/交换缓冲区(SwapBuffer)

• 渲染缓冲区⼀般映射的是系统的资源⽐如窗⼝。如果将图像直接渲染到窗⼝对应的渲染缓冲区,则可以将图像显示到屏幕上。但是,值得注意的是,如果每个窗⼝只有⼀个缓冲区,那么在绘制过程中屏幕进⾏了刷新,窗⼝可能显示出不完整的图像
• 为了解决这个问题,常规的OpenGL程序⾄少都会有两个缓冲区。显示在屏幕上的称为屏幕缓冲区,没有显示的称为离屏缓冲区。在⼀个缓冲区渲染完成之后,通过将屏幕缓冲区和离屏缓冲区交换,实现图像
在屏幕上的显示。
• 由于显示器的刷新⼀般是逐⾏进⾏的,因此为了防⽌交换缓冲区的时候屏幕上下区域的图像分属于两个不同的帧,因此交换⼀般会等待显示器刷新完成的信号,在显示器两次刷新的间隔中进⾏交换,这个信
号就被称为垂直同步信号,这个技术被称为垂直同步
• 使⽤了双缓冲区和垂直同步技术之后,由于总是要等待缓冲区交换之后再进⾏下⼀帧的渲染,使得帧率⽆法完全达到硬件允许的最⾼⽔平。为了解决这个问题,引⼊了三缓冲区技术,在等待垂直同步时,来回交替渲染两个离屏的缓冲区,⽽垂直同步发⽣时,屏幕缓冲区和最近渲染完成的离屏缓冲区交换,实现充分利⽤硬件性能的⽬的

参考

《OpenGL编程指南》
《OpenGL超级宝典》
视觉笔记——CC老师

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,026评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,655评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,726评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,204评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,558评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,731评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,944评论 2 314
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,698评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,438评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,633评论 2 247
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,125评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,444评论 3 255
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,137评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,103评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,888评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,772评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,669评论 2 271