OpenGL学习笔记
良心教程 LearnOpenGL
我所有的代码都放在github
什么是OpenGL
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。但OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。没有定义实现,具体实现取决于不同厂商。
核心模式与立即渲染模式
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线): 简单但缺少灵活性,OpenGL3.2开始不鼓励使用
核心模式(Core-profile):更高的灵活性和效率,然而也更难于学习,要求使用者真正理解OpenGL和图形编程。
扩展
OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。
状态机
OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。
开始之前
在画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL有目的地从这些操作抽象(Abstract)出去。这意味着我们不得不自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
幸运的是,有一些库已经提供了我们所需的功能,其中一部分是特别针对OpenGL的。这些库节省了我们书写操作系统相关代码的时间,提供给我们一个窗口和上下文用来渲染。最流行的几个库有GLUT,SDL,SFML和GLFW。在教程里我们将使用GLFW。
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入
环境搭建
环境我使用的是 windows(mingw-w64)/linux(gcc) + vscode ide
库的安装过程都差不多,vscode 在linux下也能用
下载GLFW源码包
使用win下的图形化cmake编译,BUILD_SHARED_LIBS
打钩,打开build目录用mingw32-cmake
编译
$ # linux 手动
$ mkdir build && cd build
$ cmake path/to/src -DBUILD_SHARED_LIBS=ON
$ make
$ sudo make install
因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法因平台而异,运的是,有些库能简化此过程,其中GLAD是目前最新,也是最流行的库。
glad在线服务
gl版本选3.3
或以上 profile
选core
选中Generate a loader
生成,下载压缩包,里面有include
和src
目录,需要在项目中使用
给glad.c
弄成静态库更方便操作
$ cd src
$ gcc -c -I../include glad.c
$ ar -rc glad.a glad.o
开始
在cmake中配置一下,像这样
cmake_minimum_required(VERSION 2.6)
project(learnopengl)
# 添加头文件所在目录和库文件目录,告诉cmake去哪里找头文件和库文件
include_directories(D:\\workspace\\mingw64\\mingw64\\include)
link_directories(D:\\workspace\\mingw64\\mingw64\\lib)
add_executable(test main.cpp)
target_link_libraries(test glfw3 glad opengl32) # linux下是 libGL.so
生成一个窗口
#include <iostream>
#include <glad/glad.h> // 注意这个头文件要放glfw前面
#include <GLFW/glfw3.h>
#include <stdlib.h>
using namespace std;
int main()
{
cout << "hellow" << endl;
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
system("pause");
return 0;
}
环境就搭建好了
运行时找不到库文件的话直接把库文件扔进C:\Windows\System32
目录