首先要了解OpenGL的图形管线有哪些内容,再分别去了解其中的相关的关系;

管线分别包括了顶点缓冲区/数组对象,定点着色器,纹理,片段着色器,变换反馈,图元装配,光栅化,逐片段操作,帧缓冲区。其中顶点着色器和片段着色器是管线的可编程阶段。

  1. 顶点着色器

    其实现了顶点操作的通用可编程方法,其的输入包括了如下:

    着色器程序-描述顶点上执行操作的顶点着色器程序源代码或者可执行程序么,其实就是那个glsl的文件。

    顶点着色器输入(或者属性)-用顶点数组提供的每个顶点的数据,应该是着色器程序语言中的那个attribute语句。

    统一变量(uniform)-顶点(或者片段)着色器使用的不变数据。应该是使用了uniform的语句。

    采样器-代表顶点着色器使用纹理的特殊统一变量类型。应该是使用了sample的语句。

有个注意的地方,在OpenGL ES 2.0中,顶点着色器的输出称作可变变量,也就是varying的语句,但是在3.0中改名为顶点着色器输出变量。

图元光栅化阶段,可以将每个生成的片段计算顶点着色器输出值并作为输出传递给片段着色器。在3.0中,增加一个新的功能,变换反馈,可以使顶点着色器的输出可以选择性的写入到一个输出缓冲区,而不一定会传送到片段着色器。

其中,统一变量uniform,存储组合的模型视图喝投影矩阵。顶点着色器的输入in,顶点着色器的输出out;

  1. 图元装配

顶点着色器之后,下一阶段就是图元装配,图元是三角形、直线或者精灵等几何对象,图元的每个顶点被发送到顶点着色器的不同拷贝。在图元装配期间,这些顶点被组合成图元。

对于每个图元,必须确定图元是否位于视锥体(屏幕上可见的3D空间区域)内,如果图元没有完全在视锥体之内,则可能需要进行裁剪,如果图元完全在该区域之外,它就会被抛弃,裁剪之后,顶点位置被转换成屏幕坐标,或者进行一次淘汰操作,根据图元面向前方或者后方来抛弃它们。接下来就可以进入到管线的下一阶段-光栅化阶段。

  1. 光栅化

此时,绘制的图元仍是点精灵或者直线或者三角形精灵等等。其实光栅化就是将这些图元转化成一组二维片段的过程,每个片段的输出包括了屏幕坐标,颜色等属性和纹理坐标等。然后,这些片段由片段着色器来处理。

  1. 片段着色器

在光栅化阶段对于每个图元生成的每个片段都会去执行这个片段着色器的程序。采用如下的输入:

着色器程序,描述片段上所执行操作的片段着色器源代码或者可执行程序。

输入变量,光栅化单元用插值为每个片段生成的顶点着色器输出,也就是顶点着色器中的输出值作为其的输入变量。

统一变量,片段(或者顶点)着色器使用的不变数据。

采样器,代表片段着色器所用纹理的特殊统一变量类型。

片段着色器可以抛弃片段,也可以生成一个或者多个颜色值作为输出。一般来说,除了渲染到多重渲染之外,片段着色器只输出一个颜色值,在多重渲染目标的情况下,为每个渲染目标输出一个颜色值。光栅化阶段生成的颜色、深度、模版和屏幕坐标位置变成管线逐片段的输入。

注意的是,顶点着色器必须输出和片段着色器读入的同一组变量。

  1. 逐片段操作

其中,逐片段的操作包括很多的操作,包括了

片段数据,像素归属测试,裁剪测试,模版测试,深度测试,混合,抖动。

其中片段的数据也就是执行了片段着色器的操作后的数据。

像素归宿测试,确定帧缓冲区中位置的像素目前是不是归OpenGL es所有。这个测试能够使窗口系统能够控制帧缓冲区中的哪些像素属于当前OpenGL es的上下文。比如一个显示OpenGL es帧缓冲区窗口的窗口被另一个窗口所遮蔽,则窗口系统可以确定被遮蔽的像素不属于OpenGL es上下文,从而完全不显示这些像素,这个由OpenGL es内部进行,不受人的控制。

裁剪测试,确定是否位于作为OpenGL es状态的一部分的裁剪矩形范围内。

模版和深度测试,这些测试将在输入片段的模版和深度值上进行,以确定片段是否应该被拒绝。

混合,将新生成的片段颜色值和保存在帧缓冲区位置的颜色值结合起来。

抖动,可用于最小化,因为使用有限精度在帧缓冲区中保存颜色值而产生的伪像。

OpenGL ES 3.0 基础知识的更多相关文章

  1. 在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping)

    在 OpenGL ES 2.0 上实现视差贴图(Parallax Mapping) 视差贴图 最近一直在研究如何在我的 iPad 2(只支持 OpenGL ES 2.0, 不支持 3.0) 上实现 视 ...

  2. OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型

    OpenGL ES 2.0 Shader 调试新思路(二): 做一个可用的原型 目录 背景介绍 请参考前文OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 优化 ledCha ...

  3. OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式

    OpenGL ES 2.0 Shader 调试新思路(一): 改变提问方式 --是什么(答案是具体值) VS 是不是(答案是布尔值) 目录 背景介绍 问题描述 Codea 是 iPad 上的一款很方便 ...

  4. 基于Cocos2d-x学习OpenGL ES 2.0系列——纹理贴图(6)

    在上一篇文章中,我们介绍了如何绘制一个立方体,里面涉及的知识点有VBO(Vertex Buffer Object).IBO(Index Buffer Object)和MVP(Modile-View-P ...

  5. 基于Cocos2d-x学习OpenGL ES 2.0系列——使用VBO索引(4)

    在上一篇文章中,我们介绍了uniform和模型-视图-投影变换,相信大家对于OpenGL ES 2.0应该有一点感觉了.在这篇文章中,我们不再画三角形了,改为画四边形.下篇教程,我们就可以画立方体了, ...

  6. 基于Cocos2d-x学习OpenGL ES 2.0系列——你的第一个三角形(1)

    前言 在本系列教程中,我会以当下最流行的2D引擎Cocos2d-x为基础,介绍OpenGL ES 2.0的一些基本用法.本系列教程的宗旨是OpenGL扫盲,让大家在使用Cocos2d-x过程中,知其然 ...

  7. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  8. Beginning OpenGL ES 2.0 with GLKit Part 1

    Update 10/24/12: If you’d like a new version of this tutorial fully updated for iOS 6 and Xcode 4.5, ...

  9. OpenGL ES 3.0 点,线,三角形绘制形式总结

    OpenGL ES 3.0 顶点     -1,  1, 0, -0.5f,  0, 0,     0, -1, 0,    -1,  0, 0, 0.5f,   0, 0,     1, -1,   ...

随机推荐

  1. javascript中window.event事件用法详解

    转自http://www.jb51.net/article/32564.htm描述 event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等. event对象只在事件发生 ...

  2. SQL中N $ # @的作用

    declare @sql nvarchar(4000) set @sql= N'select @TotalRecords=count(*) from ' + N'(' + @sqlFullPopula ...

  3. npm更换淘宝镜像

    镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): 1.通过config命令 npm config set registry https://regist ...

  4. Windows服务定时运行,判断当前时间是否在配置时间段内

    /// <summary> /// 判断程序是否在设置运行时间内 /// </summary> /// <param name="startTime" ...

  5. 用DataSet方式更新数据库表

    /* 用DataSet的方式更新数据库表 * 注意:用DataSet更新数据库表的时候,该表必须指定主键或者是唯一列 */ string connString = "Data Source= ...

  6. C#学习笔记5:数据类型与进制转换

    1.C#: 8种整形类型.2种用于科学计算的二进制浮点类型.1种用于金融计算的十进制浮点类型. 2.Decimal是一种特殊的浮点类型,能够存储大数字而无表示错误. 常用于货币计算.在表示的所有十进制 ...

  7. C#中调用存储过程

    [csharp] view plain copy print? string strsql = "Data Source=192.168.24.53;Initial Catalog=JF_C ...

  8. C# is 强制转换

    在平时开发中,经常遇上强制转换,在这过程中经常遇上null对象转换为值类型,如果不判断的情况下在编译的时候不会出错,但程序一运行就抛出错误.好在C#为我们提供了is ,它判断一个对象如果成立就转换,如 ...

  9. DOM4j--write

    import java.io.File; import java.io.FileNotFoundException;import java.io.FileOutputStream;import jav ...

  10. TimesTen ODBC 链接库差异及相关命令行工具的使用注意事项

    1. TimesTen有两种访问模式:Direct模式和Client/Server模式,以下为来自Operations Guide 的描述 Connecting using TimesTen ODBC ...