OpenGL渲染框架搭建
OpenGL场景控制
初始化
使用的glfw
和glad
。glad
需要将glad.c
引入到工程中。
在使用glfw
建立窗口后,使用glad
获得OpenGL
函数地址,可以看到的是一些宏。这样在上下文中就可以使用OpenGL
的函数了。
static void init(int WIDTH, int HEIGHT, std::string name)
{
if (glfwInit() == -1)
Error("glfw init failed");
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
window = glfwCreateWindow(WIDTH, HEIGHT, name.data(), nullptr, nullptr);
if (window == NULL)
{
glfwTerminate();
Error("Failed to create GLFW window");
}
glfwMakeContextCurrent(window);
// 注册回调
glfwInitCallback();
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
Error("Failed to initialize GLAD");
}
glEnable(GL_DEPTH_TEST);
}
全局变量
在OpenGL
环境中,需要用一些全局变量来控制渲染流程,使用函数的静态变量来进行包装,主要有以下变量。
static bool f[256]; // 键盘数组
static bool firstMouse; // 标志是否第一次进入窗口
static GLfloat lastX; // 上一次的鼠标位置,用于改变相机俯仰角
static GLfloat lastY;
static std::vector<Model *> model_list; // 场景中的模型
static GLFWwindow * window; // glfw窗口
static GLfloat deltaTime; // 时间控制
static GLfloat lastFrame;
键盘控制
函数注册。
static void glfwInitCallback()
{
glfwSetKeyCallback(window, RenderingApp::keyfunc); // 键盘控制
glfwSetCursorPosCallback(window, RenderingApp::mouse_callback); // 鼠标控制
}
控制细节。
// 处理键盘
static void keyfunc(GLFWwindow* window, int key, int scancode, int action, int mode)
{
// 设置键盘数组
if (key == GLFW_KEY_ESCAPE)
return;
if (action == GLFW_PRESS)
{
if (key == GLFW_KEY_Q)
{
glfwSetWindowShouldClose(window, GL_TRUE);
return;
}
for (auto &m : model_list)
m->setKey(key, true);
f[key] = true;
}
else if (action == GLFW_RELEASE)
{
f[key] = false;
for (auto &m : model_list