OpenGL ES glDrawArray 和 glDrawElements 用法区别

ChatGPT 3.5 国内中文镜像站免费使用啦

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 特效

零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录  >> OpenGL ES 转场

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES 函数

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GPUImage 使用

零基础 OpenGL ES 学习路线推荐 :  OpenGL ES 学习目录 >> OpenGL ES GLSL 编程


一.前言

OpenGL ES 中,glDrawArrays 和 glDrawElements 都是用于绘制图形的函数。它们之间的主要区别在于如何指定顶点数据。

  1. 1.glDrawArrays:使用连续的一组顶点来定义几何图形。
  2. 2.glDrawElements:使用索引数组来定义几何图形。

二.glDrawArrays 函数简介

glDrawArrays 函数是 OpenGL ES 中的一个函数,用于根据指定的顶点数组绘制图形。它会按照给定的模式和顶点数目从当前绑定的缓冲区对象中读取数据,并将这些数据传递给 OpenGL ES 渲染管线进行处理。 函数声明:

/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES glDrawArrays 函数
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

/*
*描述:用于根据指定的顶点数组绘制图形
*
*参数讲解:
* mode:表示要绘制哪种类型的图元,可以是 GL_POINTS、GL_LINES、GL_LINE_STRIP、GL_TRIANGLES 等等。
* first:表示从哪个位置开始读取顶点数据,通常为0。
* count:表示要使用多少个顶点来绘制图形。
*
*返回值:无
*/

void glDrawArrays(GLenum mode, GLint first, GLsizei count);

三.glDrawElements 函数简介

glDrawElements 函数是 OpenGL ES 中用于绘制三角形和其他几何图形的函数之一,它使用一个索引数组来绘制三角形和其他几何图形,以下是 glDrawElements 函数的参数和返回值的解释:



/*******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:OpenGL ES glDrawArrays 函数
//@Time:2023/03/11 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/

/*
*描述:用于根据指定的顶点数组绘制图形
*
*参数讲解:
* mode:指定渲染模式,接受的参数有:GL_TRIANGLES(三角形)、GL_TRIANGLE_STRIP(三角形带)、GL_TRIANGLE_FAN(三角形扇形)等。
* count:表示要从索引缓冲区中读取多少个元素来进行绘制(指定绘制的顶点个数)。
* type:表示索引缓冲区中元素的数据类型,例如GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或者GL_UNSIGNED_INT。
* indices:表示指向存储在显存中的索引缓冲区对象(IBO)数据起始位置的指针
*
*返回值:无
*/


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

在使用 glDrawElements 函数时,需要先创建并绑定一个索引缓冲区对象,将索引数组的数据存储在该缓冲区对象中,然后使用 glVertexAttribPointer 函数指定顶点属性,使用 glEnableVertexAttribArray 函数启用顶点属性,最后调用 glDrawElements 函数进行绘制。需要注意的是,在使用 glDrawElements 函数时,索引数组中的值表示的是顶点数组中的位置信息,而不是实际的顶点值。


四.glDrawArrays/glDrawElements 案例演示


#include <GLES2/gl2.h>

void drawArrays() {
    GLfloat vertices[] = {
        -1.0, -1.0, 0.0,
        1.0, -1.0, 0.0,
        0.0, 1.0, 0.0
    };

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vertices);
    glDrawArrays(GL_TRIANGLES, 0, 3);
}

void drawElements() {
    GLfloat vertices[] = {
        -1.0, -1.0, 0.0,
        1.0, -1.0, 0.0,
        0.0, 1.0, 0.0
    };

    GLushort indices[] = {
        0, 1, 2
    };

    GLuint vbo, ibo;

    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glGenBuffers(1, &ibo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);

    glDeleteBuffers(1, &vbo);
    glDeleteBuffers(1, &ibo);
}

int main() {
    // draw using glDrawArrays
    drawArrays();

    // draw using glDrawElements
    drawElements();

    return 0;
}

在这个例子中,我们首先使用 glDrawArrays 函数来绘制一个三角形,然后使用 glDrawElements 函数来绘制相同的三角形,但是使用了索引缓冲区对象。在使用 glDrawElements 函数时,我们创建了一个 VBO 和一个 IBO ,将VBO 用于存储顶点数据,将 IBO 用于存储索引数据,然后使用 glVertexAttribPointer 和 glDrawElements 函数来绘制三角形。在最后,我们删除了 VBO 和 IBO。


五.完整案例

1.IOS Object-C 版本

IOS Object-C 图像 lookup 色彩调整:源码下载

图片[1]-OpenGL ES glDrawArray 和 glDrawElements 用法区别 - 猿说编程

2.Windows OpenGL ES 版本

Windows OpenGL ES 图像 lookup 色彩调整:源码下载

图片[2]-OpenGL ES glDrawArray 和 glDrawElements 用法区别 - 猿说编程

3.Windows OpenGL 版本

Windows OpenGL 图像 lookup 色彩调整:源码下载

图片[3]-OpenGL ES glDrawArray 和 glDrawElements 用法区别 - 猿说编程

4.MAC QT OpenGL 版本

MAC QT OpenGL 图像 lookup 色彩调整:源码下载

图片[4]-OpenGL ES glDrawArray 和 glDrawElements 用法区别 - 猿说编程

六.猜你喜欢

  1. OpenGL ES 简介
  2. OpenGL ES 版本介绍
  3. OpenGL ES 2.0 和 3.0区别
  4. OpenGL ES 名词解释(一)
  5. OpenGL ES 名词解释(二)
  6. OpenGL ES GLSL 着色器使用过程
  7. OpenGL ES EGL 简介
  8. OpenGL ES EGL 名词解释
  9. OpenGL ES EGL eglGetDisplay
  10. OpenGL ES EGL eglInitialize
  11. OpenGL ES EGL eglGetConfigs
  12. OpenGL ES EGL eglChooseConfig
  13. OpenGL ES EGL eglGetError
  14. OpenGL ES EGL eglCreateContext
  15. OpenGL ES EGL eglCreateWindowSurface
  16. OpenGL ES EGL eglCreatePbufferSurface
  17. OpenGL ES EGL eglMakeCurrent
  18. OpenGL ES EGL eglSwapBuffer
  19. OpenGL ES EGL eglDestroySurface
  20. OpenGL ES EGL eglDestroyContext
  21. OpenGL ES EGL eglQueryContext
  22. OpenGL ES EAGLContext 和 EGLContext
  23. OpenGL ES OpenGL WebGL EGL WGL 区别
  24. OpenGL ES freeglut 下载和使用
  25. OpenGL ES glew 下载和使用
  26. OpenGL ES glut 下载和使用
  27. OpenGL ES glfw 下载和使用
  28. OpenGL ES glad 下载和使用
  29. OpenGL ES glut glew glfw glad freeglut
  30. OpenGL ES google angle
  31. OpenGL Windows 搭建环境(MFC版本)
  32. OpenGL ES Windows 搭建环境(MFC版本)
  33. OpenGL ES 版本检测
  34. OpenGL GLES 和 GLSL
  35. OpenGL ES 获取最大纹理尺寸 GL_MAX_TEXTURE_SIZE
  36. OpenGL ES 获取最多纹理单元数量 GL_MAX_TEXTURE_IMAGE_UNITS
  37. OpenGL ES 纹理采样的数量限制
  38. OpenGL ES 视口宽高限制 GL_MAX_VIEWPORT_DIMS
  39. OpenGL ES 笛卡尔坐标系之纹理坐标和顶点坐标
  40. OpenGL ES 查看显卡信息
  41. OpenGL ES 正交投影和透视投影
  42. OpenGL ES GLSL 简介
  43. OpenGL ES GLSL 编译
  44. OpenGL ES glDrawArrays 函数
  45. OpenGL ES glDrawArrays 崩溃
  46. OpenGL ES glDrawArray 和 glDrawElements 用法区别
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容