OpenGL 绘制流程

OpenGL 绘制流程-猿说编程
glfw + OpenGL 绘制一个三角形并旋转的示例代码
glfw + OpenGL 绘制一个三角形并旋转的示例代码
5
限时特惠
19.9
源码为站长亲测可以使用,如果下载地址无效,请直接留言或者联系站长
付费阅读
已售 6
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(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:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/   


  // 定义顶点数组
    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:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/  


   // 顶点着色器
    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:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/*******************************************************************************************/   


  // 渲染循环
    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 绘制流程 - 猿说编程

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

图片[2]-OpenGL 绘制流程 - 猿说编程

九.猜你喜欢

  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 用法区别
  47. OpenGL 绘制流程
  48. OpenGL ES 绘制流程
ChatGPT 3.5 国内中文镜像站免费使用啦
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容