浅谈OpenGL、OpenGL ES

最近研究安卓系统屏幕绘制这部分时,可谓是绞尽脑汁… 偶然得到家人的指点有了思路上的突破,实现了想要的功能。本篇文章结合<OpenGL编程指南>书籍的基础上,简单介绍一下OpenGL的结构。

OpenGL(Open Graphics Library)中文译为“开放图形库”,是用于渲染2D、3D图形的跨语言、跨平台的软件编程接口。OpenGL的简易版本OpenGL ES应用与android、ios等系统,图层硬件合成技术便是基于OpenGL对GPU的访问操作。早在1992年OpenGL就已经成为图像化行业的标准。

一个用来渲染图像的OpenGL程序需要执行的主要操作如下:
1.从OpenGL的几何图元中设置数据,用于构建形状;
2.使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性;
3.最后,针对光栅化过程产生的每个片元执行片元着色器,从而决定这个片元的最终颜色和位置;
4.如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行融合;

OpenGL是使用客户端——服务端的形式实现的,我们编写的应用程序可以看做客户端,而计算机图形硬件厂商所提供的OpenGL实现可以看做服务端。OpenGL的某些实现(例如X窗口系统的实现)允许服务端和客户端在一个网络内的不同计算机上运行。这种情况下,客户端负责提交OpenGL命令,这些OpenGL命令然后被转换为窗口系统相关的协议,通过共享网络传输到服务端,最终执行并产生图像内容。

OpenGL实现了我们通常所说的渲染管线,它是一系列数据处理过程,并且将应用程序的数据转换到最终渲染图像。自从OpenGL诞生以来,它的渲染管线已经发生了非常大的改变。

OpenGL首先接收用户提供的几何数据(顶点和几何图元),并且将它输入到一系列着色器阶段中进行处理,包括:顶点着色、细分着色(它本身包含两个着色器),以及最后的几何着色,然后它将被送入光栅化单元(rasterizer)。光栅化单元负责对所有剪切区域(clipping region)内的图元生成片元数据,然后对每个生成的片元都执行一个片元着色器。

在这里插入图片描述

下面介绍一些OpenGL ES常用API:

glBindFramebuffer()
将framebuffer绑定到默认的FBO出,使FBO绑定状态恢复到默认状态;

glTexImage2D()
生成一个指定范围的2D纹理(设备屏幕显示范围);

glCopyTexImage2D()
将缓冲区内的像素拷贝到2D纹理范围中;

glUniform()系列函数
指定Uniform的变量或数组的值为当前程序对象;

glUniformMatrix()系列函数
指定矩阵或矩阵数组的值为当前程序对象(着色器使用);

glVertexAttribPointer()
指定了渲染时索引值为 index 的顶点属性数组的数据格式和位置;

glViewport()
设置OpenGL显示窗口位置和大小;

glDrawElements()
从数组中获取数据渲染图元。能够通过较少的函数调用绘制多个几何图元;

glFinish()
将缓冲区的指令立即送往硬件执行,需要等到硬件执行完成才能继续向下执行(同步方式),一般用来测试使用;

glFlush()
将缓冲区的指令立即送往硬件执行,并且清空缓冲区,程序继续向下执行(异步方式),不需要等待执行结果。

发布了87 篇原创文章 · 获赞 195 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/84570484