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

基本概念

OpenGL定义了一个跨编程语言的,跨平台的编程接口的规格,是一个性能卓越的三维图形标准。OpenGL是一个专业的图形程序接口,是一个功能强大,调用方便的底层图形库。OpenGL ES是专为嵌入式和移动设备设计的一个2D/3D轻量级图形库。是OpenGL的一个子集。

3D图像的最小单位成为点(point)或者顶点(vertex)。它们代表三维空间中的一个点并用来建造更复杂的物体。多边形是由一个个点构成,而物体是由多个多边形组成。尽管通常OpenGL支持多边形,但是OpenGL ES 只支持三边形,所以即使我们要绘制一个正方形也要把它拆分成两个三角形绘制。

先说下坐标系的问题。

默认情况下,以屏幕中心为坐标轴原点。原点左方X为负值,右边为正值,原点上方Y为正值,原点下方为负值,垂直屏幕向外为Z为正值,向里为负值。

坐标如图所示:

了解了坐标轴,我们来看看怎么在坐标系中表示一个点,通常用一组浮点数来表示点。例如一个正方形的4个顶点可表示为:

    float vertices[] = {  -1.0f, 1.0f, 0.0f, //左上  -1.0f, -1.0f, 0.0f, //左下  1.0f, -1.0f, 0.0f, //右下  1.0f, 1.0f, 0.0f,  //右上  };

为了提高性能,通常还需要将浮点数组存入一个字节缓冲中。所以有了下面的操作:

 ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);  //申请内存vbb.order(ByteOrder.nativeOrder());  //设置字节顺序,其中ByteOrder.nativeOrder()是获取本机字节顺序FloatBuffer vertexBuffer = vbb.asFloatBuffer();  //转换为float型vertexBuffer.put(vertices);  //添加数据vertexBuffer.position(0);  //设置缓冲区起始位置

其中ByteOrder.nativeOrder()是获取本机字节顺序。OpenGL ES有操作图形渲染管线的函数,在默认情况下这些函数功能的使用状态是处于关闭的。 启用和关闭这些函数可以用glEnableClientState、glDisableClientState来完成。

// 指定需要启用定点数组  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);  // 说明启用数组的类型和字节缓冲,类型为GL_FLOAT  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);  // 不再需要时,关闭顶点数组  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  

       边是连接两个点的一条线,是多边形面的边缘。
      多边形

        多边形是由边构成的单闭合环。 OpenGL ES中的多边形必须是凸多边形,即在多边形的内部任意取两点, 如果连接这两个点的线段都在多变的内部,这个多边形就是凸多边形。 绘制多边形时需要指定渲染的方向, 分为顺时针和逆时针。 因为方向决定了多边形的朝向, 即正面和背面。 避免渲染那些被遮挡的部分可以了有效提高程序性能。 函数glFrontFace定义了渲染顶点的方向。
/ 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CCW);
// 设置CW方向为“正面”,CW即ClockWise,顺时针
glFrontFace(GL_CW);     

渲染

  有了以上的概念讲解后,现在要进行最主要的工作—渲染。渲染是把物体坐标所指定的图元转化成帧缓冲区中的图像。图像和顶点坐标有着密切的关系。这个关系通过绘制模式给出。常用到得绘制模式有GL_POINTS、GL_LINE_STRIP、GL_LINE_LOOP、GL_LINES、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGLE_FAN。下面分别介绍:
      GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制n个点。


GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n个线段,总共绘制N/2条线段。,如果N为奇数,则忽略最后一个顶点。
        
GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制N-1条线段。         
         
 GL_TRIANGLES:把每三个顶点作为一个独立的三角形。顶点3n-2,3n-1和3n定义了第n个三角形,总共绘制N/3个三角形。
         
 GL_TRIANGLE_STRIP:绘制一组相连的三角形。对于奇数点n,顶点n,n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1,n和n+2定义了第n个三角形,总共绘制N-2个三角形。     
         
GL_TRIANGLE_FAN:绘制一组相连的三角形。三角形是由第一个顶点及其后给定的顶点所确定。顶点1,n+1和n+2定义了第n个三角形,总共绘制N-2个三角形。
           

绘制函数:

void glDrawArrays(int mode, int first, int count)
void glDrawElements(int mode, int count, int type, Buffer indices)
glDrawArrays创建一个几何图元序列,使用每个被的数组中从first开始,到first + count – 1结束的数组元素, mode为绘制模式。
glDrawElements使用count个元素定义一个图元序列,type是indices数组中的数据类型,mode为绘制模式,indices数组存储顶点的索引值。

绘制图形步骤:

1.定义顶点并且转换存储在字节缓冲中;

2.我们使用顶点数组绘制图形,而opengles是默认关闭这个开关的,所以我们要启用它。gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

3.设置绘制的颜色。以下为设置红色

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

4.由于我们使用顶点数组,我们必须通知OpenGL顶点的数组在什么地方。需使用函数:



gl.glVertexPointer(3,//每个顶点的坐标的维数,这里为3xyzGL10.GL_FIXED,//顶点坐标值的类型为GL_FIXED0,//数组中数据的偏移值mVertexBuffer//顶点坐标数据数组);

5.开始绘图

 gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);

OK!先介绍到这里,下一篇会通过一个实例介绍OpenGL的绘图过程。

OpenGL ES基本概念介绍相关推荐

  1. Adreno OpenGL ES 3.1 介绍(3)

    Adreno OpenGL ES 3.1 介绍(3) 4.1.7单独的着色器对象 4.1.8着色器存储缓冲区对象 4.1.7单独的着色器对象 OpenGL ES中的关键对象类型之一是程序对象. 他们需 ...

  2. Adreno OpenGL ES 2.0 介绍(3)

    Adreno OpenGL ES 2.0 介绍(3) 1. 应用程序示例 1.2 在Android上创建ES 2.0 上下文/环境 1.3 Adreno GPU检测 1.4 检查支持的ES拓展 1. ...

  3. 音视频开发系列(32)OpenGL ES 基本概念

    目录 OpenGL ES的简介 OpenGL ES的基本流程和概念 篇外话:本来这篇要写SurfaceView和TextureView相关的,但是没有理解清楚,主要是对于纹理和SurfaceFling ...

  4. OpenGL ES 基础概念

    概要 状态机 上下文 渲染管线 1. 顶点数组 2. 顶点着色器 3. 图元装配 4. 光栅化 5. 片段着色器 6. 片段测试 帧缓存 / 渲染缓存 纹理 坐标系 这里主要描述一些 OpenGL E ...

  5. opengl、opengl es、webgl介绍与opengl开发入门

    1.OpenGL OpenGL(英语:Open Graphics Library,译名:开放图形库或者"开放式图形库")常用于CAD.虚拟现实.科学可视化程序和电子游戏开发.Ope ...

  6. 【Android OpenGL开发】OpenGL ES与EGL介绍

    什么是OpenGL ES OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的编程图形程序接口,主要用于图像的渲染. Android提供了简化版的OpenGL接口,即O ...

  7. OpenGL ES之三——绘制纯色背景

    概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...

  8. OpenGL ES 苹果编程指南 官方文档翻译01

    OpenGL ES Programming Guide for iOS 文章源地址(英文):https://developer.apple.com/library/ios/#documentation ...

  9. 音视频开发系列(34) OpenGL ES 绘制平面图形

    我们前两篇介绍了OpenGL ES 基本概念和GLSL及Shader的渲染流程,这篇我们开始实战,通过GLSurfaceView加载着色器,来绘制三角形.正方形和直线这些平面图形.在实践过程中遇到的问 ...

最新文章

  1. ../include/my_global.h:1107: 错误:对 C++ 内建类型‘bool’的重声明
  2. linux java maven_Linux下安装及配置Java与Maven
  3. c语言程序连接后扩展名为,C语言程序经过编译、连接后生成的可执行文件的扩展名是...
  4. php v9 分页静态,PHPCMS V9自定义栏目伪静态实现方法(列表页/分页/内容页)
  5. 2.4.3 死锁的处理策略-避免死锁
  6. VTK:彩色海拔地图用法实战
  7. Jzoj5235 好的排列
  8. python协程asyncio 应用_Python-如何使用asyncio同时运行多个协程?
  9. opensource项目_宣布2016年Opensource.com社区奖获奖者
  10. hibernate自动建表到数据库及spring下自动建表到数据库
  11. 开发人员必备的 Chrome 扩展
  12. 服务器BIOS、BMC、IPMI、EFI、UEFI等知识详解
  13. redis一般用来干嘛_谈谈redis的热key问题如何解决
  14. FreeImage通用图像加载实现
  15. 米思齐(Mixly)图形化系列教程(四)-运算符
  16. 证件照排版软件_傻瓜式证件照片排版以及尺寸的调整
  17. 城市大脑从起源到终极状态的7个阶段
  18. 数字英文唯一_福特高光归来!双喷+同级唯一8AT,福克斯“猎装”大杀四方
  19. 紫薇星上的数据结构(10)
  20. 身份证最后一位的校验

热门文章

  1. 超级计算机学校,超级计算机排名_计算机院校排名_计算机学校排名
  2. Java实现飞机大战游戏思路
  3. 如何把表格识别成电子版?这篇文章告诉你
  4. 一名数据分析师的Python学习历程
  5. 分别用Js和vue实现跑马灯效果
  6. omnicore(usdt钱包)安装步骤
  7. matlab闪退 i7,关于matlab代码运行出错的问题,在于读取文件与如何修改。
  8. Ribbon风格菜单栏
  9. 自监督模型---MoCoV3
  10. 这简历是你真实经历吗?拷打面试官轻松拿下30K自动化offer!