OpenGL ES 2.0可编程管道

上图橙色部分(Vertex ShaderFragment Shader)为此管道的可编程部分。整个管道包含以下两个规范:

1)         OpenGL ES 2.0 API specification

2)         OpenGL ES Shading Language Specification (OpenGL ES SL)

详细流程图如下:

2 Shader

Shader就是一段执行在GPU上的程序(所以Shader也可以叫做Program),此程序使用OpenGL ES SL语言来编写。它是一个描述顶点或像素特性的简单程序。

2.1 Pixel Shader

Pixel Shader(像素着色器)就是众所周知的Fragment Shader,它计算每个像素的颜色和其它属性。它通过应用光照值凹凸贴图阴影镜面高光半透明等处理来计算像素的颜色并输出。它也可改变像素的深度(z-buffering)或在多个渲染目标被激活的状态下输出多种颜色。一个Pixel Shader不能产生复杂的效果,因为它只在一个像素上进行操作,而不知道场景的几何形状。

2.2 Vertex Shader

对于发送给GPU的每一个Vertex(顶点),都要执行一次Vertex Shader(顶点着色器)。其功能是把每个顶点在虚拟空间中的三维坐标变换为可以在屏幕上显示的二维坐标,并带有用于z-buffer的深度信息。Vertex Shader可以操作的属性有:位置颜色纹理坐标,但是不能创建新的顶点。

Vertex Shader输入数据如下:

1)         Attributes: 通过顶点数组(vertex arrays)提供的每个顶点数据

2)         Uniforms: Vertex Shader使用的常量数据

3)         Samplers: Vertex Shader使用的一个表示纹理类型的Uniforms,在Vertex Shader中是可选的

4)         Shader program: Vertex Shader程序源码或可执行文件,它描述了将在顶点上执行的操作

Vertex Shader输出为varying variablesVertex Shader的输出变量,作为Fragment Shader的输入。必须与Fragment Shader中的输入Varying一一对应。)

gl_Position: 是每个点固有的Varying,表示点的空间位置。

A Vertex Shader Example

// uniforms used by the vertex shader

uniform mat4 u_mvpMatrix; // matrix to convert P from model

// space to normalized device space.

// attributes input to the vertex shader

attribute vec4 a_position;   // position value

attribute vec4 a_color;       // input vertex color

// varying variables – input to the fragment shader

varying vec4 v_color;        // output vertex color

void  main()

{

v_color = a_color;

gl_Position = u_mvpMatrix * a_position;

}

2.3 Geometry Shader

Geometry Shader是一个相对新的Shader类型。它在Driect3D 10OpenGL 3.2中开始引入,在OpengGL 2.0+中作为扩展使用。它的输入为:点、线和三角形;其输出为点、线带和三角形带。

Geometry Shader程序在Vertex Shader程序执行之后执行。

3 Shading Language

GLSL : Shading language developed for use with OpenGL
 HLSL : Shading language developed for use with the
Direct3D API

Shading
Language
仅适合于为GPU编程,编程工具为Cg(Nvidia开发),Cg编译器可以输出Direct3XOpenGL Shader程序。

4 Shading算法

4.1 插值技术(可以和任何照明模型组合)

• Flat shading 
 Gouraud shading 
 Phong shading 

4.2 照明模型(可以和任何插值技术组合)

• Blinn–Phong
 Cook–Torrance (microfacets) 
• Lambert 
 Minnaert 
• Oren–Nayar (Rough opaque diffuse surfaces) 
 Phong 
• Ward anisotropic

5 原语汇编(Primitive Assembly

在管道(pipeline)中,执行完Vertex Shader之后,就执行原语汇编。一个原语(primitive)就是一个可以使用OpenGL ES画图命令进行绘制的几何对象

在原语汇编阶段,被Vertex Shader处理输出的顶点被组合进行一个单独可被绘制的几何原语(如:点、线和三角形)。然后对几何原语执行以下两种操作:

• Clipping(裁剪): 只保留在可视空间范围内的原语

• Culling(选择): 基于面向前或后,进行原语的选择

在裁剪和选择之后,其下一个阶段为进行Geometry Shader(如果存在)或光栅化处理。

6 光栅(Rasterization

光栅处理的目标:把原语转换为一系列二维fragments,这些二维fragments将被Fragment Shader处理,且这些二维fragments表示可被绘制在屏幕上的像素。

7 Fragment Shader

对每个光栅化产生的fragment执行一次Fragment Shader,其输入内容如下:

Varying variablesVertex Shader的输出,且由光栅化单元对每个fragment使用插值方法产生
     • UniformsFragment Shader使用的常量数据
     • Samplers:一个表示纹理的常量数据
     • Shader programFragment shader程序源码或可执行文件,它描述了将在fragment上执行的操作。

Fragment Shader要么丢弃此fragment,要么为此fragment产生对应的color,并保存在gl_FragColor中.

A Fragment Shader Example:

precision mediump float;

varying vec4 v_color; // input vertex color from vertex shader

void main(void)

{

gl_FragColor = v_color;

}

8 Per-Fragment Operations

在执行Fragment Shader之后,其下一步处理为Per-Fragment Operation。其处理流程如下:

执行Per-Fragment Operation的结果为此Fragment被丢弃,或在framebuffer对应位置(Xw,Yw)写入fragment颜色值,深度值stencil值

ps:属于作者在下载文档中编辑整理的,仅仅是对opengles渲染管线的一个简单介绍。

Opengles 管线编程介绍的更多相关文章

  1. NIO和IO(BIO)的区别及NIO编程介绍

    IO(BIO)和NIO的区别:其本质就是阻塞和非阻塞的区别. 阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,直到传输完毕为止. 非阻塞概念:应用程序直接可以获取已经 ...

  2. C#多线程编程介绍——使用thread、threadpool、timer

    C#多线程编程介绍——使用thread.threadpool.timer 在system.threading 命名空间提供一些使得能进行多线程编程的类和接口,其中线程的创建有以下三种方法:thread ...

  3. UE4 中的 C++ 编程介绍

    https://docs.unrealengine.com/latest/CHN/Programming/Introduction/index.html UE4 中的 C++ 编程介绍 Unreal ...

  4. Python 网络编程介绍

    网络编程介绍 1. 目标: 编写一个C/S架构的软件 C/S: Client ----------- 基于网络 --------- Server B/S: Browser -------- 基于网络 ...

  5. WPF 3D编程介绍

    原文:WPF 3D编程介绍 上一篇文章简单的介绍了WPF编程的相关的内容,也推荐了本书.今天要来讲一下在WPF如何开展3D编程. 使用的xmal 和C#开发的时候:需要使用如下的关键要素: 1:摄像机 ...

  6. 【转载】Stackless Python并发式编程介绍[已校对版]

    Stackless Python并发式编程介绍[已校对版] 作者:    Grant Olson 电子邮件:    olsongt@verizon.net 日期:    2006-07-07 译者:  ...

  7. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  8. python--面向对象编程介绍

    暂不考虑开发场地等复杂的东西,我们先从人物角色下手, 角色很简单,就俩个,恐怖份子.警察,他们除了角色不同,其它基本都 一样,每个人都有生命值.武器等. 咱们先用非OOP的方式写出游戏的基本角色 引子 ...

  9. Linux环境高级编程--介绍

    从今天開始.将开启Linux环境高级编程(Advanced Programming Of Linux Enviroment)的学习笔记或者说总结,我将持续和大家分享自己的学习成果.本系列博客依托于li ...

随机推荐

  1. ps裁剪圆角

    1.打开要编辑的图片 2.选择圆角矩形工具,并调整半径(半径越大,角越圆),本例半径为20像素 3.使用上述工具画出选区 4.按下ctrl+enter,可以看到选区边缘描上了虚线 5.菜单栏-图像-剪 ...

  2. [原]如何在Android用FFmpeg+SDL2.0解码声音

    关于如何在Android上用FFmpeg+SDL2.0解码显示图像参考[原]如何在Android用FFmpeg+SDL2.0解码显示图像 ,本文是基于上述文章和[原]零基础学习视频解码之解码声音 来移 ...

  3. Android View的加载过程

    大家都知道Android中加载view是从Activity的onCreate方法调用setContentView开始的,那么View的具体加载过程又是怎么的呢?这一节我们做一下分析. 首先追踪一下代码 ...

  4. 使用JavaScript判断用户是否为手机设备

    最近在做微信服务号开发,其中遇到一个问题是微信服务号查看的个人的消息,如果点击在浏览器中查看(iOS中是在Safari中打开)应该是跳转到登录页面,因为页面需要从后台获取,因为需要服务端判断,如果是存 ...

  5. MyBatis知多少(6)表现层与业务逻辑层

    表现层 表现层负责向最终用户展示应用程序的控制方式以及数据.它还要负责所有信息的布局和格式.今天,商业应用程序最流行的表现方式应该算是Web前端了,它使用HTML和JavaScript并通 过Web浏 ...

  6. windows下面go语言环境搭建

    步骤一:golang下载 下载地址是:http://www.golangtc.com/download 下载完成之后解压缩,放到你的c:/根目录下面.然后配置一下环境变量! 环境变量配置如下: 1.新 ...

  7. redis实现有序的消息队列

    redis是什么东西就不多说了,网上文章一搜一大堆. 首先来说一下我要实现的功能: 类似一个消息中转站吧,如果有人要发送消息,先将消息发到我这里来,然后我这边进行转发,为的就是有一个统一的管理和修改时 ...

  8. IIS 7完全攻略之日志记录配置(摘自网络)

    IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求 ...

  9. Unity 3D 中实现对物体 位置(position) 旋转(rotation) 大小(scale) 的全面控制

    今天分享一些基础控制的脚本 1.位置(Position): 控制位置很简单,首先要知道要在xyz哪几个轴上移动,确定好后定义代表着那些轴的移动变量,速度(m_speed在函数外定义为全局变量)然后通过 ...

  10. WebGL 3D on iOS8 正式版

    今天iOS8终于正式发布了,升级了手头设备后对我来说最重要的就是测试WebGL的3D是否真的能跑苹果的系统了,跑了多个HT for Web的3D例子都非常流畅,比Android刚支持WebGL时好太多 ...