在openGL中,所有图形都是通过分解成三角形的方式进行绘制。(一个矩形分解成两个三角形进行绘制)
glDrawArrays 和 glDrawElements 的作用都是从一个数据数组中提取数据渲染基本图元。
 一、glDrawArrays(int mode,int first,int count)
1、mode:
1>GL_TRIANGLES:  意味着openGL使用三个顶点来组成图形一个三角形。顶点0,1,2组成一个三角形,顶点3,4,5组成一个三角形,直到数组结束。
2>GL_TRIANGLE_FAN:  跳过刚开始的两个顶点,然后遍历每个顶点,让openGL将这些顶点于它们前一个,以及数组的第一个顶点一起组成一个三角形。
例如四个顶点:P2、P1、P0 ; P3、P2、P0 这2个三角形。
3>GL_TRIANGLE_STRIP:   顺序在每三个顶点之间绘制三角形,这个方法可以保证从相同的方向上所有三角形均被绘制。以V0V1V2,V1V2V3,V2V3V4……的形式绘制三角形
2、first
表示从数组缓存中哪一位开始绘制,一般定义为0
3、count
顶点的数量
例子如下:
 const GLfloat vertices[] = {
-0.5f,-0.5f,0.0f,1.0f,
0.5f,-0.5f,0.0f,1.0f,
0.5f,0.5f,0.0f,1.0f,
-0.5f,0.5f,0.0f,1.0f
};

//绘制模型
glDrawArrays(GL_TRIANGLE_FAN,0,4);

二、glDrawElements

如果代码中需要索引来渲染,采用了EBO时,则需要用glDrawElements函数来代替glDrawArrays函数,来指明我们从索引缓冲渲染

void glDrawElements( GLenum mode, GLsizei count,GLenum type, const GLvoid *indices);

第一个参数指定了我们绘制的模式;
第二个参数是我们打算绘制顶点的个数;
第三个参数是索引的类型; GL_UNSIGNED_BYTE/INT/SHORT
第四个参数指向索引数组的指针

注意

  1. 绑定VAO时也会自动绑定EBO
  2. 不要在解绑VAO之前解绑EBO(GL_ELEMENT_ARRAY_BUFFER),否则它就没有这个EBO配置。

其它顺序无关,只要解绑vao在解绑ebo前边即可。

//解绑VAO
glBindVertexArray(0);
//解绑EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//解绑VBO
glBindBuffer(GL_ARRAY_BUFFER, 0);

glDrawArrays 和 glDrawElements的更多相关文章

  1. CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)

    CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...

  2. CSharpGL(21)用鼠标拾取、拖拽VBO图元内的点、线或本身

    CSharpGL(21)用鼠标拾取.拖拽VBO图元内的点.线或本身 效果图 以最常见的三角形网格(用GL_TRIANGLES方式进行渲染)为例. 在拾取模式为GeometryType.Point时,你 ...

  3. CSharpGL(20)用unProject和Project实现鼠标拖拽图元

    CSharpGL(20)用unProject和Project实现鼠标拖拽图元 效果图 例如,你可以把Big Dipper这个模型拽成下面这个样子. 配合旋转,还可以继续拖拽成这样. 当然,能拖拽的不只 ...

  4. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(3) 到上一篇为止,拾取一个VBO里的单个图元的问题已经彻底解决了.那么来看下一个问题:一个场景里可能会有多个VBO,此时每个 ...

  5. OpenGL顶点数组

    概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制 ...

  6. BIT祝威博客汇总(Blog Index)

    +BIT祝威+悄悄在此留下版了个权的信息说: 关于硬件(Hardware) <穿越计算机的迷雾>笔记 继电器是如何成为CPU的(1) 继电器是如何成为CPU的(2) 关于操作系统(Oper ...

  7. OpenGLES入门笔记一

    学习地址:http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0 中文翻译:http://www.cnblogs ...

  8. opengles2.0之图元装配和光栅化

    光栅化的过程就是把三维世界中的物体转换成屏幕上像素的过程. glGetfloatv();    --------v表示的是数组 gles2.0里面有两种绘图命令.glDrawArrays和glDraw ...

  9. [ios][opengles]GLKit如何搭一个app的框架

    一个外文对GLKit的讲解: Beginning OpenGL ES 2.0 with GLKit Part 1    英文原文链接:http://www.raywenderlich.com/5223 ...

随机推荐

  1. UOJ428. 【集训队作业2018】普通的计数题

    http://uoj.ac/problem/428 题解 神仙题. 考虑最后一定是放了一个\(1\),然后把其他位置都删掉了. 再考虑到对于序列中的每个位置都对应了一次操作. 我们可以对于每个放\(1 ...

  2. Netty 系列之 Netty 高性能之道 高性能的三个主题 Netty使得开发者能够轻松地接受大量打开的套接字 Java 序列化

    Netty系列之Netty高性能之道 https://www.infoq.cn/article/netty-high-performance 李林锋 2014 年 5 月 29 日 话题:性能调优语言 ...

  3. windows传输文件到linux脚本

    安装pscp https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html cmd脚本 @echo off rem 拷贝的文件名称 se ...

  4. Powershell 邮件发送

    目录 目录 前言 Send-MailMessage NETMail 使用OutLook发送邮件 前言 最近领导想在winServer2012上搞个自动发送邮件的计划任务,下面有几种发送邮件的方式. 如 ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第4节 模拟BS服务器案例_2_模拟BS服务器代码实现

    这三行代码是固定的在输出之前 浏览器再次访问这个页面. 图片没有显示出来 复制刚才的代码一份出来重命名 加个while循环.把代码都放进去. 然后在while里面开启一个线程.把读取的代码都放在线程里 ...

  6. IncSecond:将一个TDateTime变量加减一定数量的秒数

    http://tieba.baidu.com/p/1998083296 IncSecond:将一个TDateTime变量加减一定数量的秒数 声明:function IncSecond ( const ...

  7. python爬虫常用数据整理函数

    text()                       获取xpath中的值....../h1/text() extract()[0]              Selector的方法用于提取内容为 ...

  8. C# 模拟登陆

    原理 我们知道,一般需要登录的网站,服务器和客户端都会有一段时间的会话保持,而这个会话保持是在登录时候建立的, 服务端和客户端都会持有这个KEY,在后续访问时,都需要核对这两个KEY是否一致. 而客户 ...

  9. 请正视抑郁症(附Zung氏抑郁自评量表(SDS))

    为什么要记录? 因为去年开始关注抑郁症这块,逐渐发现抑郁症原来不只是简单的情绪问题,它是情绪与实质性的生理相互作用并紧密关联的疾病,并不是单纯的劝解自己就可以疗愈的一种疾病,它的存在需要换着身边的人帮 ...

  10. xmake v2.1.5版本新特性介绍

    2.1.5版本现已进入收尾阶段,此版本加入了一大波新特性,目前正在进行稳定性测试和修复,在这里,先来介绍下新版本中引入了哪些新特性和改进. 1. 提供类似cmake的find_*系列接口,实现各种查找 ...