OpenGL简介

前言

计算机图形学是一门很有趣的学科,但是它涉及的知识面太广,不仅包含软件方面还有硬件方面也有渗透。而对于软件开发来说,学习OpenGL无疑是接近计算机图形学的最便捷方式。

从这篇文章开始,会出一系列OpenGL的文章,还包括了移动开发中的OpenGL ES、Metal。文章的目的很简单,就是作为一种笔记来复习从OpenGL到OpenGL ES学习中的知识点,笔记实际应用开发中能否用到OpenGL也得看业务需求。同时也希望能够帮助到还未入门的小伙伴。

在文章中,如果出现了一些知识点有错误、或是有遗漏的地方,希望小伙伴们能够在文章末尾留言指出,不胜感激。

本文主要讲述OpenGL的基础知识,包括它的应用、子集、部分专业名称、固定管线、可编程管线等。从下篇文章开始编码,动手去绘制一些图元、图形等。

学习过程中参考书籍:《OpenGL超级宝典 第5版》、《3D数学基础:图形与游戏开发》、《OpenGL ES 3.0》。其中3D数学只需看前9章。

一、OpenGL是什么

1.OpenGL

用一句话概括,OpenGL是一个代码库。它是基于C语言开发的一组可跨平台的图形API,它是程序员最接近GPU的方式,它是界面渲染的主要成员,它肩负着图形图像显示到屏幕上的重任。但OpenGL从本质上讲,还是一个代码库,只不过我们不仅要会用它,还要了解图形的渲染流程。

2.DirectX

DirectX是与OpenGL齐名的另一组库,能做OpenGL做的事。它活跃在PC上,且只支持windows系统,这里知道下就OK,毕竟笔者也不怎么了解DirectX。

3.OpenGL ES

从命名上看多少能猜出它和OpenGL的关系,没错,OpenGL ES是OpenGL的子集,活跃在移动端,目前Android和iOS的渲染都用到了OpenGL ES。不过苹果总有些骚操作,在2014年开始布局Metal,到2018年宣布3D图形用Matal渲染,据说能提高10倍的渲染速度,我相信是真的。目前比较流行的flutter,2D渲染用的是skia,3D渲染用的是OpenGL ES。对于移动开发者来说,掌握OpenGL ES还是利好的。

二、OpenGL中的专业名词

OpenGL中的专业名词有很多,这里只列举比较常见的五个名词:光栅化、纹理、着色器、颜色混合、深度测试。直接去理解这些名词其实是不好理解的,而且这里没有涉及到上下文所以如果理解上有困难是正常的,在后面会将这些名词代表的过程连串起来,那时才能真正理解它们的意义,这里只是预理解。

1.光栅化

OpenGL中组成图像的基本图元有点、线、三角形、线带、线环、三角带、三角环,但最终还是由点、线、三角形组成。那么当你给出三个不在同一直线上的点让OpenGL去绘制一个三角形时,三角形范围内点的位置计算的过程叫光栅化,这是用通俗的语言来描述的。

专业一点的解释:
• 光栅化是把顶点数据转换为⽚元的过程,具有将图转化为⼀个个栅格组成的图象的作⽤,特点是每个元素对应帧缓冲区中的⼀像素。

• 光栅化就是把顶点数据转换为⽚元的过程。⽚元中的每⼀个元素对应于帧缓冲区中的⼀个像素。

• 光栅化其实是⼀种将⼏何图元变为⼆维图像的过程。该过程包含了两部分的⼯作。第⼀部分⼯作:决定窗⼝坐标中的哪些整型栅格区域被基本图元占⽤;第⼆部分⼯作:分配⼀个颜⾊值和⼀个深度值到各个区域。光栅化过程产⽣的是⽚元。

• 把物体的数学描述以及与物体相关的颜⾊信息转换为屏幕上⽤于对应位置的像素及⽤于填充像素的颜⾊,这个过程称为光栅化,这是⼀个将模拟信号转化为离散信号的过程。

如果看到这里还是一头污水,没有关系,继续往后,能找到你想要的答案。

2.纹理

如果说纹理你不好理解,那我说个你肯定知道的,那就是图片。没错,纹理你可以理解成就是图片,只不过OpenGL中通常称为纹理。

3.着色器

着色器,对图形的顶点以及光栅化之后的片元进行位置颜色计算的程序。固定管线下有多种着色器,具体可以参考这篇文章https://www.jianshu.com/p/8005dcd0dec7。在这里我简单说下顶点着色器和片元着色器,而这两种着色器也是我们唯一能够编程的着色器。

a.顶点着色器
顾名思义,顶点着色器是对图形的顶点进行计算的,包括平移、旋转、缩放等矩阵变换的计算。例如,一个三角形发生一次旋转,顶点着色器会对其进行3次计算,三角形有三个顶点,就是这个原因。总的来讲,顶点着色器用来对顶点的一些属性进行计算。

b.片元着色器
片元可以理解成像素,也就是图形上每一个像素点。而片元着色器是对每一个像素点进行计算的。光栅化过程将顶点转化成了片元,例如,将一个三角形内部的每个点的坐标和颜色值计算出来后交给了片元着色器,这时就开始了片元着色器的操作。制作滤镜就是在片元着色器程序中完成的,利用颜色混合,达到不同的滤镜效果。

注意:由于一个图形可能是多个三角形组成,而每个图形内部的像素点特别多,如果是串行去出来每个点的计算,那么对于用户将是一场灾难,因为你可能需要等待数秒才能看到屏幕成像。GPU对顶点、片元的计算都是并行的,这也是它擅长的工作。

4.颜色混合

颜色混合是将不同的颜色值通过一些算法,最终得到一个颜色值。比如rgba(0.4, 0.5, 0.6, 0.4)和rgba(0.6, 0.1, 0.0, 0.7)进行混合,可能得到rgba(0.55, 0.3, 0.2, 0.56),这个结果是随便写的,仅限方便理解。通过颜色混合我们可以实现不同的滤镜,图片灰度、马赛克等。颜色混合一般发生在片元着色器中。

5.深度测试

深度测试用一句容易理解的说话来概述,它就是3D空间坐标(x,y,z)中的z值。屏幕是二维的,如何渲染3D图形,使那些图形看起来像3D,就需要开启深度测试,这样OpenGL通过投影算法,将z值参与计算,才能达到3D的效果。总的来说,深度测试就是让图形每个点坐标(x,y,z)中的z有意义,否则不管设置z是多少,它都会被当做0处理。

三、管线渲染流程

管线,初次见到这个名词其实是很难理解的,但是我们用另一个大家都熟悉的词来描述,流水线。对,管线就像流水线一样,每一步都已经设计好了,GPU按照固定的流程去渲染图形。有些工厂流水线上全是机器操作不需要人为干预,这种叫固定管线;还有一些部分流程可以让人去干预,这种叫可编程管线。OpenGL中的可编程管线就是顶点着色器和片元着色器。我们来看一看管线的渲染流程,从顶点着色器到片元着色器,如图1所示。


图1

以一个三角形为例,从可编程管线的流程出发,一起看看我们能做的是什么。

画一个三角形需要传入三角形的三个顶点,传给顶点着色器之后,顶点着色器是可编程的,所以这里我们可以对其进行操作。比如图片翻转中,改变顶点和纹理坐标的对应关系可实现图片翻转。

顶点着色器到片元着色器中间的过程我们是无法改变的,他们是固定管线,到了片元着色器也是可编程的。在片元着色器中,需要计算每个片元对应的颜色,这时片元着色器会从顶点的颜色值去取,或者从纹理中取。这一步也是可以编程的,在这一步我们可以实现不同的滤镜效果,上面已经说过很多次了。

总结

这一篇文章主要是简单介绍了OpenGL相关的知识,以及讲述了滤镜实现的可行性。后续开始OpenGL的图元绘制,从下一篇文章开始将加入绘制的部分代码。

你可能感兴趣的:(OpenGL简介)