零基础 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.glDrawArrays:使用连续的一组顶点来定义几何图形。
- 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 色彩调整:源码下载
2.Windows OpenGL ES 版本
Windows OpenGL ES 图像 lookup 色彩调整:源码下载
3.Windows OpenGL 版本
Windows OpenGL 图像 lookup 色彩调整:源码下载
4.MAC QT OpenGL 版本
MAC QT OpenGL 图像 lookup 色彩调整:源码下载
六.猜你喜欢
- OpenGL ES 简介
- OpenGL ES 版本介绍
- OpenGL ES 2.0 和 3.0区别
- OpenGL ES 名词解释(一)
- OpenGL ES 名词解释(二)
- OpenGL ES GLSL 着色器使用过程
- OpenGL ES EGL 简介
- OpenGL ES EGL 名词解释
- OpenGL ES EGL eglGetDisplay
- OpenGL ES EGL eglInitialize
- OpenGL ES EGL eglGetConfigs
- OpenGL ES EGL eglChooseConfig
- OpenGL ES EGL eglGetError
- OpenGL ES EGL eglCreateContext
- OpenGL ES EGL eglCreateWindowSurface
- OpenGL ES EGL eglCreatePbufferSurface
- OpenGL ES EGL eglMakeCurrent
- OpenGL ES EGL eglSwapBuffer
- OpenGL ES EGL eglDestroySurface
- OpenGL ES EGL eglDestroyContext
- OpenGL ES EGL eglQueryContext
- OpenGL ES EAGLContext 和 EGLContext
- OpenGL ES OpenGL WebGL EGL WGL 区别
- OpenGL ES freeglut 下载和使用
- OpenGL ES glew 下载和使用
- OpenGL ES glut 下载和使用
- OpenGL ES glfw 下载和使用
- OpenGL ES glad 下载和使用
- OpenGL ES glut glew glfw glad freeglut
- OpenGL ES google angle
- OpenGL Windows 搭建环境(MFC版本)
- OpenGL ES Windows 搭建环境(MFC版本)
- OpenGL ES 版本检测
- OpenGL GLES 和 GLSL
- OpenGL ES 获取最大纹理尺寸 GL_MAX_TEXTURE_SIZE
- OpenGL ES 获取最多纹理单元数量 GL_MAX_TEXTURE_IMAGE_UNITS
- OpenGL ES 纹理采样的数量限制
- OpenGL ES 视口宽高限制 GL_MAX_VIEWPORT_DIMS
- OpenGL ES 笛卡尔坐标系之纹理坐标和顶点坐标
- OpenGL ES 查看显卡信息
- OpenGL ES 正交投影和透视投影
- OpenGL ES GLSL 简介
- OpenGL ES GLSL 编译
- OpenGL ES glDrawArrays 函数
- OpenGL ES glDrawArrays 崩溃
- OpenGL ES glDrawArray 和 glDrawElements 用法区别
暂无评论内容