首先要了解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. Ⅲ.spring的点点滴滴--赋值

    承接上文 对象的赋值(调用方式都一样不再阐述) .net篇(环境为vs2012+Spring.Core.dll v1.31) public class PropertyDemo{ public Sys ...

  2. 两个字符串,若为数字则都相加,若有一个不为数字则,输出error

    import java.util.*; /*请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法输入则返回“error”: * 用例:123 234 * 输出:357 * 用例123 as ...

  3. Flume连接Kafka的broker出错

    在启动Flume的时候,出现下面的异常,但是程序照样能运行,Kafka也能够收到数据,只是偶尔会断点. 2016-08-25 15:32:54,561 (SinkRunner-PollingRunne ...

  4. 介绍一些适用于 Web 开发者的 Atom 编辑器插件

    Atom 的社区很繁荣,有着丰富的扩展/插件(packages).安装 Atom 的 Package 非常简单,可以在编辑器的偏好设置里面安装,也可以在命令行中使用 apm 命令来安装. 在介绍适用于 ...

  5. 关于Eclipse中的egit的常规使用和模板

    修改bug的模板 要提交的comment信息.TDI-31426 fix bug: if get studio license use : Import License :after get lice ...

  6. 创建eclipse新的workspace并设置workspace共享配置

    一:创建新的workspace 1.File——Switch Workspace——Other 2.修改workspace路径和名称 3.修改后如下: 4.点击OK按钮后,eclipse自动重启 同时 ...

  7. my_vimrc

    " ----------------- Author: Ruchee" ----------------- Email: my@ruchee.com" --------- ...

  8. 结果集一组数据的第几条ROW_NUMBER基本用法

    因为项目中用到,今天来记录下 ROW_NUMBER的用法. 说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始. 语法:ROW_NUMBER () OVER ([ <partitio ...

  9. 一个ASP函数库

    <% '****************************** '类名: '名称:通用库 '日期:2008/10/28 '作者:by xilou '网址: '描述:通用库 '版权:转载请注 ...

  10. 命令行创建AVD

    1.命令行创建AVD android create avd -n myAvd -t 8 -b armeabi-v7a -p d:\scard.img -s HVGA 2.删除AVD android d ...