您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > OpenGL-ES-2.0
OpenGLES2.0——苹果俱乐部@LUT内部讲座主讲人:Jaylee.WuAgenda•OpenGLES的简介•OpenGLES的结构组件•UsefulExtensionAPIs•一个标准的OpenGLES程序流程OpenGLES的简介•OpenGLES是OpenGraphicsLibraryforEmbeddedSystem的简写,是通用的图形界面库OpenGL的一个子集,专用于描绘智能终端设备的图形系统•与OpenGL同负盛名的另一种桌面图形库是DirectX,后者常用于3D游戏开发中OpenGLES的简介•OpenGLES并不是一种编程语言。它实际上是一种支持多操作平台(Windows,Linux,Unix,MacOS等)图像绘制的API库,能够为多个平台下的编程环境所调用进行图像的绘制•除了OpenGLES自身的一些基本API外,还有许多第三方的标准扩展接口OpenGLES的简介•注意OpenGLES1.1Spec和OpenGLES2.0Spec之间存在的区别:1.1Spec中主要使用固定函数实现功能;在2.0spec中主要使用Shader模型来描绘图形•对于图像的描绘是基于图元进行的,也就是点、直线和三角形,对于图元的描绘主要是通过定义端点操作进行的OpenGLES的结构组件•Buffers•VertexShader•RasterizationStage•FragmentShader•EGLSystemVertexArrays/BufferObjectsVertexShaderPrimitiveAssemblyRasterizationFragmentShaderPer-FragmentOperationsFrameBufferOutputAPIsInputAPIs在整个OpenGLES2.0体系中,最为重要的就是两个shader,它们各自的功能将在下面给出详细介绍•VertexShader–主要由变量参数、常量参数、输出变量和shader程序组成–作用就是进行矩阵的坐标变换、计算per-vertex的颜色、生成和变换纹理坐标等–变量参数是由vertexarray来提供的,每一个vertex可以拥有一个array来为自己提供关于坐标和点信息的参数,通常选取不同vertex的过程也可以称之为采样•VertexShader–常量参数通常在OpenGLES程序开始渲染操作之前定义,这一组参数有时可以在两个shader中进行共享–输出变量是一组矢量,整个vertexshader的作用就是将输入的信息进行矢量化输出–Shader模型是整个vertexshader组件的核心和灵魂,也是程序员需要设计和工作的主要部分内容,使用shading语言编写•FragmentShader–主要作用是将前面生成的fragment进行一些必要的测试和处理,加入一定的视觉效果,然后传输给后面的framebuffer–需要进行的主要测试包括裁减测试、深度测试、模型测试、多采样操作和混合操作等–视觉效果包括纹理(非常重要,后面单独讨论)、阴影和烟雾效果等–也需要使用shading语言进行模型的编写•Texturing(纹理操作)–作为OpenGLES中的另一个重要的操作步骤,纹理操作是对每一个像素点进行修饰的基本手段之一,它是在fragmentshader中进行的–注意:纹理操作是唯一一种由OpenGLES的基本API所支持的视觉效果,其它的几种视觉效果,如烟雾和阴影等,都需要由扩展的API来支持,即需要引用扩展库•Texturing(纹理操作)–Texturing可以分为2Dtexturing和3Dtexturing两种,分别代表二维和三维图像的纹理描绘操作,二维的较常见Texture1.00.01.00.0坐标要进行极化操作,即尺寸变换为(0.0,1.0)•Texturing(纹理操作)–三维图像处理常称为cubemaptexture,多出了一个cubeface的参量,需要在处理时指出是针对哪一个cubeface,然后处理的过程与2D的类似–MipMap:这是一种图像压缩存储技术。原理是将图像按照2:1的尺寸循环压缩得到一组图像列并将它们存储起来,对不同距离的显示调用不同的图像,texturing中用到•Shading语言–用于shader中的语言与C语言的操作和规范有很大的相似,语法也基本上完全一样,称之为shading语言。下面来简单的介绍一下shading语言中的一些基本规范–变量:Scalars(int,long,double),Boolean,Vectors,Floats,Matrix–常量:使用const声明–Structures,Arrays,Enum,if(),for()等•Shading语言–操作符:+,-,*,/,++,--,=,+=,-=,*=,/=,&&,||,^^等–Preprocessors&Directives:#define,#if,#ifend,#else,#undef等–函数:特别地,函数的变量需要加修饰符(in,out,inout),用来区别变量的使用范围–加入了几个特殊的元素:uniforms,attributes和veryings(详见下页)•Shading语言–Uniforms:用于存储shader需要的各种数据,例如转换矩阵、光线参数和颜色等,可以被vertexshader和fragmentshader所共享使用,数量有一定的限制–Attributes:仅在vertexshader中使用,常用于指出per-vertex的输入数据–Veryings:用于存储vertexshader的输出和fragmentshader的输入,中间过渡结构组件补充说明•Buffers–在整个OpenGLES体系中,有标准API组件提供的buffer,还有标准扩展组件中使用的buffer。常用的有framebuffer,renderbuffer,texturebuffer和fragmentbuffer等。–主要为各种中间临时数据提供存储空间结构组件补充说明•RasterizationStage–此组件是位于vertexshader和fragmentshader之间的一个重要步骤,主要用于将三维的物体转化为二维化的fragments,然后送入fragmentshader组件–还可以对点效果、线段和三角形等进行坐标和参数的变换等结构组件补充说明•EGLSystem–EGLsystem是介于OpenGLES显示和宿主系统中的窗口显示之间的一个API组件,主要用于为系统的窗口系统提供相应的接口函数来间接调用OpenGLES中的图形系统–EGLsystem中有窗口和pbuffer组件,它们必须在初始化的阶段被成功创建UsefulExtensionAPIs•3Dtexturing–使用#extensionGL_OES_texture_3D:enable开启此扩展–功能类似于2Dtexture,只是加入了第三维的信息,可作为cubemap的另一种选择–在此三维图形中读取二维信息是通过第三维切片的思想实现的,即实现三维的二维化UsefulExtensionAPIs•EricssonTextureCompression(ETC)–GL_OES_compressed_ETC1_RGB8_texture–此扩展可以用来将RGB纹理图像进行压缩处理,然后生成以块为单位的压缩格式,每一个块中可以存储64bits的信息,通常4*4个块组成一个单元–这样处理之后,原来的纹理图像需要的存储空间与现在的存储空间的比例可以达到8:3,大大的节省了纹理信息的存储空间UsefulExtensionAPIs•Floating-PointTexture–扩展了OpenGLES中的浮点数精度,可以使用16-bit和32-bit长度的浮点数•Nun-Power-of-TwoTexture(npot)–使用扩展GL_OES_texture_npot–帮助放宽对于纹理边界长度必须是2的指数运算值的限制标准OpenGLES程序流程•1.定义uniforms和attributes•2.创建shaders和主program,并读取uniforms和attributes至shader中•3.编译并连接shader至主program•4.完成主program的验证操作并初始化rendering操作,即开始图形预绘制标准OpenGLES程序流程•4.1首先,在vertexshader中进行图元顶点的坐标变换、纹理坐标的生成等•4.2其次,经由primitive的Assembly和Rasterization操作,进行3D图像的平面化和2D图像的拆解操作•4.3最后,送至fragmentshader中进行视觉效果(主要是纹理效果)的添加标准OpenGLES程序流程•5.对fragmentshader输出的图像执行per-fragmentoperation,包括透明度测试、裁减测试、模板测试、深度测试和混色操作等•6.创建framebuffer,renderbuffer和textureobject,分别用于存储帧信息、颜色和深度等信息标准OpenGLES程序流程•7.将renderbuffer,textureobject和framebuffer链接,并对framebuffer执行完整性检测•8.绑定framebuffer和localwindowsystem,调用EGLAPIsystem,进行显示的映射。也就是将framebuffer中的内容显示在屏幕上程序的示意流程图VertexShadersourcecodeCompilePhaseFragmentShadersourcecodeVertexShaderobjectFragmentShaderobjectLinkPhaseProgramobjectSetactiveExecutableprogramTheEnd
本文标题:OpenGL-ES-2.0
链接地址:https://www.777doc.com/doc-7259572 .html