简介
本文主要根据Learnopengl的节奏分章节分享学习心得,后续会持续更新,本章介绍使用GLFW和GLAD,创建一个可以使用opengl绘制的窗口。
学习网站:主页 - LearnOpenGL CN
如果环境搭建大家还有问题请移步环境搭建教程。
环境搭建链接如下:WSL2+XLaunch配置opengl开发环境-CSDN博客
前置知识
需要先了解OpenGL、GLFW和GLAD是做什么的。
OpenGL
OpenGL (Open Graphics Library) 是一种用于渲染 2D 和 3D 图形的跨语言、跨平台的编程接口(API)。OpenGL 提供了一组底层的图形渲染函数,这些函数可以直接与图形硬件交互,实现高效的图形渲染。
OpenGL 可以认为是一套接口,一套标准对接图像渲染的。
OpenGL 只负责渲染图形,不包含创建窗口、处理用户输入等功能。这些功能通常需要通过其他的库(如 GLFW )来实现。
GLFW
GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文、定义窗口参数以及处理用户输入。
可以认为该模块的作用是绘制一个窗口,并且把用户输入等都封装好了。
GLAD
因为OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的。由于OpenGL驱动版本众多,它大多数函数的位置都无法在编译时确定下来,需要在运行时查询。所以任务就落在了开发者身上,开发者需要在运行时获取函数地址并将其保存在一个函数指针中供以后使用。取得地址的方法根据平台均有不同。
GLAD是一个开源的库,它能解决我们上面提到的那个繁琐的问题。GLAD的配置与大多数的开源库有些许的不同,GLAD使用了一个在线服务。在这里我们能够告诉GLAD需要定义的OpenGL版本,并且根据这个版本加载所有相关的OpenGL函数。
创建窗口
建议跟我一样的初学者 请删除环境搭建后拿到的参考代码,从一个空白全新的cpp开始,这样可以更系统的了解每一步的作用,多在学习中试错 切勿全部放到工作中。
首先把最基本的流程一步步的拆解下。
使用GLFW进行窗口创建
添加头文件和main函数
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main()
{
return 0;
}
仿佛回到了梦开始的地方~
添加GLFW初始化
int main()
{
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);
return 0;
}
我们在main函数中调用glfwInit函数来初始化GLFW,然后我们可以使用glfwWindowHint函数来配置GLFW,上述例子是配置GLFW版本和模式。
创建一个窗口对象
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);
创建了窗口对象 并且绑定上下文。这里glfwMakeContextCurrent主要作用绑定窗口和上下文。给到gpu渲染使用。
GLAD的初始化
到这里后面需要渲染出图了,就需要使用opengl的原生接口,要用到GLAD出马啦
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
这里会把opengl的接口都加载好了 后面就可以开心的使用了
设置Viewport
我们需要告诉OpenGL渲染窗口的尺寸大小,即视口(Viewport),这样OpenGL才只能知道怎样根据窗口大小显示数据和坐标。我们可以通过调用glViewport函数来设置窗口的维度。
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
这里就已经把渲染大小设置到了OpenGL,到这里就已经可以显示了, 但是会一闪而过。
为了避免这个问题 需要添加一个循环
添加绘制循环
while(!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
到这里 任务都已经结束了
编译 准备执行把 正常的话 你会得到一个黑色的矩形框
修改矩形颜色
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor函数用于设置显示缓存的背景颜色 前三个参数是对应的RGB颜色通道取值是0-1对应RGB颜色通道的(0-255)
glClear 函数是屏幕清理动作,GL_COLOR_BUFFER_BIT是清理屏幕
把上述添加到循环中即可以自由切换窗口颜色啦
在此奉上全部源码
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
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);
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
while(!glfwWindowShouldClose(window))
{
glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
下一章会介绍三角形和着色器 共勉