目录
什么是OpenGL?
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
核心模式与立即渲染模式
立即渲染模式 (Immediate mode)
早期的OpenGL使用的模式(也就是固定渲染管线) OpenGL的大多数功能都被库隐藏起来,容易使用和理解,但是效率太低。 开发者很少能控制OpenGL如何进行计算 因此从OpenGL3.2开始,推出核心模式。
核心模式(Core-profile)
也叫可编程管线,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。
状态机
OpenGL自身是一个巨大的状态机 变量(描述该如何操作)的大集合 OpenGL的状态通常被称为上下文(Context)。 状态设置函数(State-changing Function) 状态应用的函数(State-using Function)。
对象
OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个。
创建窗口
不同操作系统上,创建支持OpenGL的窗口接口不同。需要我们自己处理创建窗口,定义OpenGL上下文以及处理用户输入。不同操作系统,不同显卡获取OpenGL函数的接口也有差异。
GLFW库解决操作系统层面的不同 创建窗口 定义上下文 处理用户输入。
GLAD库使得代码可以用于不同的OpenGL驱动 OpenGL本身只是标准/规范 各个厂家具体实现方式可以不同。
如果没有类似GLAD的库,windows下:
配置环境
首先打开vs创建工程,然后右击工程的属性。
将 glfw库和glad库的头文件路径选择进来。
然后配置库文件的路径。
在Windows上,请使用OpenGL库opengl32.lib(随Microsoft SDK一起提供,在安装Visual Studio时默认安装)。
然后添加glad的源文件。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void processInput(GLFWwindow* window);
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL) {
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return -1;
}
//GLFW将窗口的上下文设置为当前线程的上下文
glfwMakeContextCurrent(window);
//GLAD
// glad: 加载所有OpenGL函数指针
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 渲染循环
while (!glfwWindowShouldClose(window)) {
glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //状态设置
glClear(GL_COLOR_BUFFER_BIT); //状态使用
processInput(window);
// glfw: 交换缓冲区和轮询IO事件(按键按下/释放、鼠标移动等)
glfwSwapBuffers(window);
glfwPollEvents();
}
// glfw: 回收前面分配的GLFW先关资源.
glfwTerminate();
return 0;
}
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
此代码是显示暗绿色窗口的代码,用于测试配置环境。
最后分享一下glad库和glfw库的百度网盘链接。
链接:https://pan.baidu.com/s/1QYk3zhQUgzNJBXVTE-n3Sg
提取码:0z63
参考: