- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
干货贴:资深图形开发者必备技能及学习资源
干货贴:资深图形开发者必备技能及学习资源作者:魏明阳1. 什么是OpenGL ES? OpenGL ES 是一个为便携或嵌入式设备例如:移动电话、PDAs、监视器、等, 发展的3D 绘图APIs(应用编程接口)。OpenGL ES 是一个被叫做Khronos 联盟的组织创造的一系列APIs 中的一个。Khronos 联盟成立于2000 年一月,是一个专注为手持和嵌入式设备建立开放标准和自由版权的APIs 的工业联盟。因为OpenGL 作为3D API 的广泛使用,这是很自然的从桌面的OpenGL 开始发展为手持设备和便携式开放标准的3D API;又因为使用OpenGL ES 的设备地址空间和内存的限制、低的内存带宽、敏感的电源功耗、缺乏浮点运算硬件, 所以修改它以适用与手持和便携设备领域。工作组对OpenGL ES 做了下面的一些定义限制。OpenGL ES API 是巨大的和复杂的,工作组的目标是建立一个适合设备驱动程序。为此工作组删除了一些OpenGL API 的冗余设计,对同一种操作有多种实现方法,只留下主要的,多余的技术被删除,例如:一个几何体,OpenGL 中可以使用立即模式、显示列表、顶点矩阵,在OpenGL ES 中只能使用顶点矩阵, 显示列表和立即模式被移除。移除冗余是重要的,但保持兼容性也是重要的。尽可能的OpenGL ES 被设计成OpenGL 的嵌入式子集,OpenGL 将也能运行OpenGL ES 的程序。原因是作为一个子集能更好的应用桌面程序的代码和工具。所以一般嵌入式设备,或者准备开发跨平台相关都会用到OpenGL Es 这个轻量级而不是OpenGL。2. 着色器和和可编程管道: OpenGL ES 2.0 包含两部分:OpenGL ES 2.0 API 说明和OpenGL ES 着色器语言说明。Shader 就是我们所说的着色器,着色器对于OpengGL ES 的来说是很重要的。因为所有的渲染都是要经过shader。Shader 其实就是一段执行在GPU 上的程序, 此程序使用OpenGL ES SL 语言来编写。它是一个述顶点或像素特性的简单程序。在opengles 中常用的shader 有两种:vertex shader 和fragment shader。Geometry Shader(几何着色器)是继Vertex Shader 和Fragment Shader 之后。下图显示OpenGL ES 2.0 图像管线,图中的着色器盒子述了OpenGL ES 2.0 的管道可编程各个阶段。着色器是OpenGL ES 2.0 以上API 核心的基础。每个OpenGL ES 程序要求一个顶点着色器和一个片段着色器去渲染一个图形。对着色器来说,使用着色器渲染有两个基本的对象类型你需要去创建:着色器对象和项目对象。如何理解着色器对象和项目对象,可以对比C 语言的编译器和连接器。C 语言编译器可以从项目源码产生目标码(.obj 或者.o 文件),然后C 连接器链接目标码成为最后的程序。如下图就是一段简单的可编程的shader 代码。它类似c 语言,是需要动态编译,编译成功后会生成一个正整数,通过glUseProgram 函数将二进制传递给GPU 使其按照自己的需求去渲染。所以我们很多时候需要通过修改shader 得到想要的渲染效果。一些更高级的操作,例如位移矩阵、计算光照方程、产生贴图坐标等都是需要修改shader 来实现的。如下图是一个可以通过传递a_mvpMatrix 矩阵变量来进行图形变量。图形的变化就要设计到矩阵。而shader 里面可以定义mat4 类型的矩阵,然后乘以一个原始定点坐标。如果我们传入的矩阵是一个正价矩阵,那么是不会变化的,相当于是传递1。3. OpenGL ES 基础API 简介以及绘图: OpenGL ES 单纯是没有那些高级图元,比如正方形,圆等。OpenGL ES 2.0 能绘制的基元有:三角形、直线、点、三角形。所以复杂的图形,如圆、矩形、不规则多边形都是通过画三角形来实现的。基元是使用glDrawArrays 和glDrawElements 能够绘制的图形。基元是一系列用顶点位置、颜色、贴图坐标等信息述的顶点。glLineWidth(GLfloat width)设置线条基本宽度:opengl 标准没有定义线宽的具体数值,这个是每个GPU 自己内部定义的,甚至同一款GPU 换了显卡驱动后都不一定一样,想跨平台的话,不能依赖于具体某个GPU 给出的值,所以宽度一般不能设置太大,实践中我们也发现设置超过某个范围就不能再宽了。当然我们的需求也不会要求你设置很宽。glViewport( 0, 0, esContext-width, esContext-height); 设置视口glV
文档评论(0)