OpenGL ES 2.0基本概念

原创 2015年07月06日 20:51:40

1. OpenGL ES 2.0可编程管道

    OpenGL负责把三维空间中的对象通过投影、光栅化转换为二维图像,然后呈现到屏幕上。


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

        1) OpenGL ES 2.0 API specification

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

       详细流程图如下:

        此流程把三维数据变换为可以显示的二维数据。

2. Shader(就是一段程序Program)

        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 variables(Vertex 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 10和OpenGL 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编译器可以输出Direct3X或OpenGL 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 variables:Vertex Shader的输出,且由光栅化单元对每个fragment使用插值方法产生
     • Uniforms:Fragment Shader使用的常量数据
     • Samplers:一个表示纹理的常量数据
     • Shader program:Fragment 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值



版权声明:本文为原创文章,转载请标明出处。

基于OpenGL ES 的深度学习框架编写

本文出自:http://blog.csdn.net/jxt1234and2010/article/details/71056736 基于OpenGL ES的深度学习框架编写 背景与工程...
  • hb707934728
  • hb707934728
  • 2017年05月08日 14:04
  • 1368

OpenGL ES基本概念介绍

最近不太忙,打算这周开始学习下OpenGL,网上也已经有好多关于OpenGL的书籍和资料了。至于为什么还要写,是为了养成一个良好的学习习惯,也算给自己的学习过程做一个总结。          基...
  • wangkuifeng0118
  • wangkuifeng0118
  • 2012年04月03日 10:23
  • 6030

OpenGL ES 2.0 Shader总结

自从Android 2.2启用了OpenGL ES 2.0之后,Android上图形开发就进入了GLSL(OpenGL Shader Language)时代;现今Vulkan以无可阻挡的大势将取代Op...
  • xiyanlgu
  • xiyanlgu
  • 2016年03月15日 15:54
  • 1563

OpenGL ES 2.0 - 绘制方式

绘制方式各种绘制方式GL_POINTSGL_LNESGL_LINE_STRIPGL_LINE_LOOPGL_TRIANGLESGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_TR...
  • sz66cm
  • sz66cm
  • 2017年01月09日 14:25
  • 733

Joe's OpenGL ES 2.0 系列经典入门教程(第一课:Introduction)

偶然机会,大柚发现一套非常适合ru
  • luozhonglan
  • luozhonglan
  • 2014年04月12日 23:19
  • 1693

OpenGL ES 2.0 - 纹理映射

OpenGL ES 2.0 - 纹理映射 拉伸 采样 mipmap 多重纹理 过程纹理
  • sz66cm
  • sz66cm
  • 2017年01月10日 20:04
  • 779

Android OpenGL ES2.0之光照的学习总结

在OpenGL ES2.0的光照开发中,需要知道三种光照的来源:环境光、散射光、镜面光。 环境光:不但入射是各向均匀的,反射也是各向均匀的。ambient 环境光照射结果 = 材质的反射系数 X 环境...
  • baipeng298
  • baipeng298
  • 2015年08月02日 21:26
  • 890

在win7下搭建OpenGL ES 2.0的开发环境

一、所用到的工具和软件: 1.AMD的OpenGL ES 2.0的模拟器:模拟器 2.Visual Studio 2015 3.《OpenGL ES2.0 Programming guide》里...
  • linshuhe1
  • linshuhe1
  • 2016年04月05日 21:02
  • 1342

Windows搭建OpenGL ES 2.0开发环境

1.下载并安装AMD的OpenGL ES2.0的模拟器 【AMD:老牌模拟器,已经随着AMD的手持设备业务一起卖给Qualcomm。这款模拟器基本上中规中矩,用于 桌面开发OpenGL ES 2的开发...
  • panda1234lee
  • panda1234lee
  • 2016年06月30日 00:49
  • 1836

win7下搭建OpenGL ES 2.0开发环境

1. 下载AMD的OpenGL ES2.0的模拟器,下载地址: http://www.opengles-book.com/ESEmulator.2009-04-28-v1.4.APRIL_2009_R...
  • wang15061955806
  • wang15061955806
  • 2016年06月07日 20:35
  • 1318
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenGL ES 2.0基本概念
举报原因:
原因补充:

(最多只允许输入30个字)