终渲管线Pipeline
前言在前2篇文章中,我们都说到着色器,且在第二篇中正式说到,这着色器只能用在OpenGL ES2.x等可编程管道里面,而在OpenGL ES1.x是不能用的。但我们一直没有说这是为什么,两者有什么区别。那这篇我们就一起来学习下OpenGL ES中的渲染管道。 正文管道,英文名叫Pipeline,相信用过FaceBook图片加载库的同学对这个管道并不陌生,因为SimpleImageDrawee里面也是用的管道来对图片进行的一个处理。由于其底层也是C,因此我可以大胆的猜想,FaceBook图片加载库的设计思路可能有参考OpenGL(这当然纯属臆想^_^)。 即是管道,那就得有先后顺序。整体是从上游流到下游。 从上图可以看出,这些工艺顺序是固定的。整个过程又可以分成三部分:处理顶点、处理片元、验证片元信息并存入内存。 这里对于Rasterizer光栅化,让我们一起来了解学习下: Rasterizer/Rasterization:光栅化处理这个词儿Adobe官方翻译成栅格化或者像素化。没错,就是把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。(或:所顶点从世界坐标系转换为屏幕坐标系的片元) 现在是一个多元化的社会,是一个讲个性化的社会,什么都想着个性化,OpenGL ES也不例外,它为个性化的需求提供了接口。如图一中的蓝色方块部分,就是可以高度定制化的地方,因此也就形成了OpenGL ES2.x等的可编程管道,在OpenGL ES里面有两个专用的词VertexShader(顶点着色器)、FragmentShader(片元着色器),分别对应图一中的Coordinate蓝色块和Texture等蓝色块。 下面就看下OpenGL ES2.0 可渲染管道图: VertexShader:顶点着色器顶点着色器,记得在前2篇中,我们有贴出2个着色器的脚本语句,再次贴出如下:
下面看下vertexShader语句中的关键字: PrimitiveAssembly:图元装配图元即图形,在OpenGL中有几个基本图元:点,线,三角形,其它的复杂图元都是基于这些基本图元来绘成的。 FragmentShader:片元着色器片元着色器主要是对光栅化处理后生成的片元逐个进行处理。接收顶点着色器输出的值,需要传入的数据,以及它经过变换矩阵后输出值存储在哪里可以通过 下图一目了然: 因为Rasterization光栅化处理后,图元只是在屏幕有了象素,却还没有进行颜色处理,还是看不到东西。 Per-Fragment Operations:逐个片元操作阶段在片元着色器对片元进行综合的处理,并最终为片元生成一个颜色值并存储在gl_FragColor变量后,接下来就是逐个对片元进行一系列的测试。在上面我们说到,在光栅化处理时,它由于是把顶点从世界坐标系转换到屏幕坐标系,因此在光栅处理后,每个片元在屏幕上都有个坐标(Xw,Yw).且存储在了帧缓冲区(FrameBuffer),包括片元着色器也是对(Xw,Yw)这个坐标的片元进行处理。 Pixel ownership test:像素所有权测试,它决定FrameBuffer中某一个(Xw,Yw)位置的像素是否属于当前 Opengl ES的context,比如:如果一个Opengl ES帧缓冲窗口被其他窗口遮住了,窗口系统将决定被遮住的像素不属于当前Opengl ES的context,因此也就不会被显示。 Scissor test:裁剪测试决定,判断某一个位置为(Xw,Yw)的片元是否位于裁剪矩形内,如果不在,则被丢弃。 参考资料Android OpenGL ES 开发教程(3):OpenGL ES管道(Pipeline) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- macos – Swift抓住“我的卡”CNContact
- 在iOS上升级到Opencv 2.4.5后编译器错误.有这些问题的快速解
- node.js express中app.param的用法详解
- C++ string构造函数和析构函数详解
- 【VB6】VB6类库项目中的Persistable
- ruby – 如何使用sinatra会话
- 如何使用新的PostgreSQL JSON数据类型中的字段进行查询?
- .net – 如何使用Click Once构建单一实例应用程序?
- 自定义View XML文件出现No resource identifier found for
- 如何获取Oracle Coherence群集中的所有缓存名称?