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)在整个绘制流程中所处的位置和作用。

原文地址:https://www.cnblogs.com/jacobchen/p/14844430.html