zoukankan      html  css  js  c++  java
  • OpenGL学习笔记(三)

    本篇主要讲述关于glad库的使用、mac上如何使用OpenGL 3.3 Core模式,以及shader原理。

    1. glad

    由于OpenGL只是一套规范,具体的实现因显卡驱动和操作系统而异,比如在MacOS或Windows上,某些复杂点的OpenGL API函数指针并不一致。

    为了在运行时在不同操作系统上找到对应的函数指针,glad库帮我们封装了这些操作,屏蔽了平台对的差异性。

    我们可以通过这个glad在线生成器来获得对应的代码,按下图的选择,点击generate即可。

    然后会获得一个glad压缩包,解压后有include和src代码,放到工程目录下,更新CMake file。

    cmake_minimum_required(VERSION 3.0.0)
    project(learn_opengl VERSION 0.1.0)
    
    find_package(glfw3 3.3 REQUIRED)
    include_directories(third_party/glad/include)
    
    add_executable(learn_opengl main.cpp third_party/glad/src/glad.c)
    target_link_libraries(learn_opengl glfw "-framework OpenGL")

    在代码中初始化glfw之后再初始化glad即可。

    #include "glad/glad.h"

    if
    (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; }

    2. OpenGL 3.3 Core模式

    我们即将涉及shader编程,需要OpenGL版本提升到3.3以上,同时由于MacOS的特殊之处,需要多设置一步GLFW_OPENGL_FORWARD_COMPAT。

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // MacOS兼容
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    同时,OpenGL Core模式要求绑定VAO(Vertex Array Object,顶点数组对象)用于处理顶点输入,不然OpenGL不会绘制出内容。

    unsigned int VAO;
    glGenVertexArrays(1, &VAO);
    glBindVertexArray(VAO);

    3. shader原理

    shader(着色器)是一段类似C语言规范的程序,运行在GPU上。

    一般地,shader有两类:vertex shader(顶点着色器)和fragment shader(片段着色器,又叫pixel shader像素着色器)。

    有了shader,我们就可以更加灵活地命令OpenGL绘制出想要的效果。

    当OpenGL进行绘制的时候,每次绘制顶点会调用一次vertex shader,而每次绘制一个像素点会调用一次fragment shader,可以看出,两种shader被调用的开销不是同一个量级的。

    这篇文章很好地解释了shader是什么以及应用场景:Understanding Shaders, the secret sauce of 3D engines

    一张图直观感受一下vertex shader和fragment shader(pixel shader)在整个绘制流程中所处的位置和作用。

  • 相关阅读:
    二叉树遍历问题、时间空间复杂度、淘汰策略算法、lru数据结构、动态规划贪心算法
    Django--csrf跨站请求伪造、Auth认证模块
    Django--中间件
    Django--Cookie和Session组件
    Django--form表单组件
    安装配置flask环境
    Django--模型层
    Django--路由层、视图层、模版层
    Eclipse SVN文件冲突及不能直接提交情况
    Eclipse开发Web常见异常
  • 原文地址:https://www.cnblogs.com/jacobchen/p/14844430.html
Copyright © 2011-2022 走看看