零基础 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(Open Graphics Library)是一个跨平台的图形编程接口,它提供了一系列函数,可以实现 2D 和 3D 图形的创建、渲染和处理。OpenGL 绘制流程如下:
一.初始化OpenGL环境
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 创建窗口和OpenGL上下文GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL);if (window == NULL){printf("Failed to create GLFW window\n");glfwTerminate();return -1;}glfwMakeContextCurrent(window);// 初始化GLEW库glewExperimental = GL_TRUE;if (glewInit() != GLEW_OK){printf("Failed to initialize GLEW\n");return -1;}/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 创建窗口和OpenGL上下文 GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL); if (window == NULL) { printf("Failed to create GLFW window\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 初始化GLEW库 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { printf("Failed to initialize GLEW\n"); return -1; }/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 创建窗口和OpenGL上下文 GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Window", NULL, NULL); if (window == NULL) { printf("Failed to create GLFW window\n"); glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 初始化GLEW库 glewExperimental = GL_TRUE; if (glewInit() != GLEW_OK) { printf("Failed to initialize GLEW\n"); return -1; }
二.定义图形数据
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 定义顶点数组GLfloat vertices[] = {// 位置 // 颜色-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f,0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f,0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f};// 创建顶点缓冲对象GLuint VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);// 设置顶点属性指针glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 定义顶点数组 GLfloat vertices[] = { // 位置 // 颜色 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; // 创建顶点缓冲对象 GLuint VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(1);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 定义顶点数组 GLfloat vertices[] = { // 位置 // 颜色 -0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; // 创建顶点缓冲对象 GLuint VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat))); glEnableVertexAttribArray(1);
三.加载纹理
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 加载纹理int width, height;unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB);GLuint texture;glGenTextures(1, &texture);glBindTexture(GL_TEXTURE_2D, texture);glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image);glGenerateMipmap(GL_TEXTURE_2D);SOIL_free_image_data(image);glBindTexture(GL_TEXTURE_2D, 0);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 加载纹理 int width, height; unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 加载纹理 int width, height; unsigned char* image = SOIL_load_image("container.jpg", &width, &height, 0, SOIL_LOAD_RGB); GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); glGenerateMipmap(GL_TEXTURE_2D); SOIL_free_image_data(image); glBindTexture(GL_TEXTURE_2D, 0);
四.编写着色器程序
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 顶点着色器const GLchar* vertexSource ="#version 330 core\n""layout (location = 0) in vec3 position;\n""layout (location = 1) in vec3 color;\n""layout (location = 2) in vec2 texCoord;\n""out vec3 Color;\n""out vec2 TexCoord;\n""uniform mat4 transform;\n""void main()\n""{\n"" gl_Position = transform * vec4(position, 1.0f);\n"" Color = color;\n"" TexCoord = vec2(texCoord.x, 1.0f - texCoord.y);\n""}\0";// 片元着色器const GLchar* fragmentSource ="#version 330 core\n""in vec3 Color;\n""in vec2 TexCoord;\n""out vec4 outColor;\n""uniform sampler2D ourTexture;\n""void main()\n""{\n"" outColor = texture(ourTexture, TexCoord) * vec4(Color, 1.0f);\n""}\n\0";// 编译着色器程序GLuint vertexShader, fragmentShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexSource, NULL);glCompileShader(vertexShader);fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentSource, NULL);glCompileShader(fragmentShader);// 创建着色器程序并链接GLuint shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 顶点着色器 const GLchar* vertexSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "layout (location = 1) in vec3 color;\n" "layout (location = 2) in vec2 texCoord;\n" "out vec3 Color;\n" "out vec2 TexCoord;\n" "uniform mat4 transform;\n" "void main()\n" "{\n" " gl_Position = transform * vec4(position, 1.0f);\n" " Color = color;\n" " TexCoord = vec2(texCoord.x, 1.0f - texCoord.y);\n" "}\0"; // 片元着色器 const GLchar* fragmentSource = "#version 330 core\n" "in vec3 Color;\n" "in vec2 TexCoord;\n" "out vec4 outColor;\n" "uniform sampler2D ourTexture;\n" "void main()\n" "{\n" " outColor = texture(ourTexture, TexCoord) * vec4(Color, 1.0f);\n" "}\n\0"; // 编译着色器程序 GLuint vertexShader, fragmentShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexSource, NULL); glCompileShader(vertexShader); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentSource, NULL); glCompileShader(fragmentShader); // 创建着色器程序并链接 GLuint shaderProgram; shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 顶点着色器 const GLchar* vertexSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "layout (location = 1) in vec3 color;\n" "layout (location = 2) in vec2 texCoord;\n" "out vec3 Color;\n" "out vec2 TexCoord;\n" "uniform mat4 transform;\n" "void main()\n" "{\n" " gl_Position = transform * vec4(position, 1.0f);\n" " Color = color;\n" " TexCoord = vec2(texCoord.x, 1.0f - texCoord.y);\n" "}\0"; // 片元着色器 const GLchar* fragmentSource = "#version 330 core\n" "in vec3 Color;\n" "in vec2 TexCoord;\n" "out vec4 outColor;\n" "uniform sampler2D ourTexture;\n" "void main()\n" "{\n" " outColor = texture(ourTexture, TexCoord) * vec4(Color, 1.0f);\n" "}\n\0"; // 编译着色器程序 GLuint vertexShader, fragmentShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexSource, NULL); glCompileShader(vertexShader); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentSource, NULL); glCompileShader(fragmentShader); // 创建着色器程序并链接 GLuint shaderProgram; shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram);
五.绑定顶点数组和着色器程序
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 使用着色器程序和顶点数组glUseProgram(shaderProgram);glBindVertexArray(VAO);glBindTexture(GL_TEXTURE_2D, texture);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 使用着色器程序和顶点数组 glUseProgram(shaderProgram); glBindVertexArray(VAO); glBindTexture(GL_TEXTURE_2D, texture);/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 使用着色器程序和顶点数组 glUseProgram(shaderProgram); glBindVertexArray(VAO); glBindTexture(GL_TEXTURE_2D, texture);
六.执行绘制命令
/*******************************************************************************************///@Author:猿说编程//@Blog(个人博客地址): www.codersrc.com//@File:OpenGL 绘制流程//@Time:2023/03/11 08:00//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!/*******************************************************************************************/// 渲染循环while (!glfwWindowShouldClose(window)){// 清空颜色缓冲区glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 创建变换矩阵glm::mat4 transform;transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f));transform = glm::rotate(transform, (GLfloat)glfwGetTime() * 50.0f, glm::vec3(0.0f, 0.0f, 1.0f));GLint transformLoc = glGetUniformLocation(shaderProgram, "transform");glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform));// 绘制图形glDrawArrays(GL_TRIANGLES, 0, 3);// 交换缓冲区并检查事件glfwSwapBuffers(window);glfwPollEvents();}/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 渲染循环 while (!glfwWindowShouldClose(window)) { // 清空颜色缓冲区 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 创建变换矩阵 glm::mat4 transform; transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f)); transform = glm::rotate(transform, (GLfloat)glfwGetTime() * 50.0f, glm::vec3(0.0f, 0.0f, 1.0f)); GLint transformLoc = glGetUniformLocation(shaderProgram, "transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform)); // 绘制图形 glDrawArrays(GL_TRIANGLES, 0, 3); // 交换缓冲区并检查事件 glfwSwapBuffers(window); glfwPollEvents(); }/*******************************************************************************************/ //@Author:猿说编程 //@Blog(个人博客地址): www.codersrc.com //@File:OpenGL 绘制流程 //@Time:2023/03/11 08:00 //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! /*******************************************************************************************/ // 渲染循环 while (!glfwWindowShouldClose(window)) { // 清空颜色缓冲区 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 创建变换矩阵 glm::mat4 transform; transform = glm::translate(transform, glm::vec3(0.5f, -0.5f, 0.0f)); transform = glm::rotate(transform, (GLfloat)glfwGetTime() * 50.0f, glm::vec3(0.0f, 0.0f, 1.0f)); GLint transformLoc = glGetUniformLocation(shaderProgram, "transform"); glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(transform)); // 绘制图形 glDrawArrays(GL_TRIANGLES, 0, 3); // 交换缓冲区并检查事件 glfwSwapBuffers(window); glfwPollEvents(); }
七.完整代码
以上是一个 glfw + OpenGL 绘制一个三角形并旋转的示例代码。
八.OpenGL 实战演示
1.Windows OpenGL 色阶调节:源码下载
![图片[1]-OpenGL 绘制流程 - 猿说编程](https://www.codersrc.com/wp-content/uploads/2022/08/aa2d5aa68d16cf1.gif)
2.Windows OpenGL 图像 lookup 色彩调整:源码下载
![图片[2]-OpenGL 绘制流程 - 猿说编程](https://www.codersrc.com/wp-content/uploads/2023/03/%E5%BD%95%E5%88%B6_2023_03_04_14_22_23_968.gif)
九.猜你喜欢
- 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 用法区别
- OpenGL 绘制流程
- OpenGL ES 绘制流程
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容