OpenGL ES glDrawArrays 函数

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 编程


一.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);

三.glDrawArrays 函数注意事项

  1. 1.在调用此函数之前必须先激活需要使用到的着色器程序以及相关变量和纹理等资源。
  2. 2.调用此函数时需要确保已经正确地设置了视口大小以及投影矩阵和模型视图矩阵等状态信息。
  3. 3.glDrawArrays 函数用于执行顶点数组的渲染操作,它可以绘制任何形状,包括三角形、四边形、多边形等等。
  4. 4.在调用 glDrawArrays 函数之前,需要先设置顶点属性指针,以指定顶点数组中的数据类型、偏移量、步长等信息。
  5. 5.glDrawArrays 函数的第一个参数指定了绘制的图元类型,例如 GL_TRIANGLES 表示绘制三角形,GL_TRIANGLE_STRIP表示绘制三角形条等等。
  6. 6.glDrawArrays 函数的第二个参数指定了要绘制的顶点数量。
  7. 7.glDrawArrays 函数可以绘制多个图元,每个图元的顶点数量可以不同。
  8. 8.glDrawArrays 函数是一个同步函数,它会阻塞程序的执行,直到渲染完成。如果需要异步执行渲染操作,可以使用 OpenGL ES 的多线程或多进程技术。
  9. 9.在使用双缓冲技术时,需要先调用 glDrawArrays 函数绘制顶点数组,再调用 eglSwapBuffers 函数交换渲染缓冲区,才能显示渲染结果。
  10. 10在使用 glDrawArrays 函数时,需要保证顶点数组中的数据类型和着色器程序中的数据类型匹配,否则渲染结果可能会不正确。

四.glDrawArrays 函数完整案例代码

glDrawArrays 函数用于执行顶点数组的渲染操作,下面是一个简单的演示代码:

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


#include <GLES3/gl3.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>

EGLDisplay display;
EGLSurface surface;
EGLContext context;

GLfloat vertices[] = {
    // 顶点坐标,颜色
    -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, // 左上角,红色
    -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // 左下角,绿色
    0.5f, -0.5f, 0.0f, 0.0f, 1.0f, // 右下角,蓝色
    0.5f, 0.5f, 1.0f, 1.0f, 0.0f // 右上角,黄色
};
GLuint indices[] = {
    0, 1, 2,
    0, 2, 3
};

GLuint vao, vbo, ebo, program;

const GLchar* vertexShaderSource =
    "#version 300 es\n"
    "layout(location = 0) in vec2 position;\n"
    "layout(location = 1) in vec3 color;\n"
    "out vec3 vColor;\n"
    "void main()\n"
    "{\n"
    "    vColor = color;\n"
    "    gl_Position = vec4(position, 0.0, 1.0);\n"
    "}\n";
const GLchar* fragmentShaderSource =
    "#version 300 es\n"
    "precision mediump float;\n"
    "in vec3 vColor;\n"
    "out vec4 fragColor;\n"
    "void main()\n"
    "{\n"
    "    fragColor = vec4(vColor, 1.0);\n"
    "}\n";

void initialize()
{
    // 创建顶点数组对象
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    // 创建顶点缓存对象
    glGenBuffers(1, &vbo);
    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 创建索引缓存对象
    glGenBuffers(1, &ebo);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

    // 编译链接着色器程序
    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);

    program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glLinkProgram(program);

    // 设置顶点属性指针
    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);

    // 解绑定
    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

void drawScene()
{
    // 使用着色器程序
    glUseProgram(program);

    // 绑定顶点数组对象
    glBindVertexArray(vao);

    // 绘制顶点数组
    glDrawArrays(GL_TRIANGLES, 0, 6);

    // 解绑定
    glBindVertexArray(0);
}

int main(int argc, char** argv)
{
    // 初始化EGL和OpenGL ES上下文
    display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    eglInitialize(display, 0, 0);

    EGLint configAttribs[] = {
        EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
        EGL_RED_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_BLUE_SIZE, 8,
        EGL_ALPHA_SIZE, 8,
        EGL_DEPTH_SIZE, 16,
        EGL_NONE
    };
    EGLint numConfigs;
    EGLConfig config;
    eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);

    EGLint surfaceAttribs[] = {
        EGL_RENDER_BUFFER, EGL_BACK_BUFFER,
        EGL_NONE
    };
    surface = eglCreateWindowSurface(display, config, win, surfaceAttribs);

    EGLint contextAttribs[] = {
        EGL_CONTEXT_CLIENT_VERSION, 3,
        EGL_NONE
    };
    context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs);

    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
        printf("Failed to make current\n");
        return -1;
    }

    // 初始化OpenGL ES
    initialize();

    // 渲染OpenGL场景
    drawScene();

    // 刷新OpenGL缓存,提交命令到GPU
    glFlush();

    // 交换渲染缓冲区,显示渲染结果
    eglSwapBuffers(display, surface);

    // 释放资源
    eglDestroyContext(display, context);
    eglDestroySurface(display, surface);
    eglTerminate(display);

    return 0;
}

五.glDrawArrays 函数使用案例

1.IOS Object-C 版本

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

图片[1]-OpenGL ES glDrawArrays 函数-猿说编程

2.Windows OpenGL ES 版本

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

图片[2]-OpenGL ES glDrawArrays 函数-猿说编程

3.Windows OpenGL 版本

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

图片[3]-OpenGL ES glDrawArrays 函数-猿说编程

4.MAC QT OpenGL 版本

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

图片[4]-OpenGL ES glDrawArrays 函数-猿说编程

ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容