本文基于win10 + Visual Studio 2019,基于OpenGL3.3。参考 learnopengl之“创建窗口”和“你好,窗口”。
一、准备工作
环境配置
环境配置详情见“创建窗口”。
GLFW是什么?
GLFW是一个开源的C/C++库,用于创建和管理OpenGL窗口、上下文和输入。它提供了一些用于处理窗口事件、键盘输入、鼠标输入和游戏手柄输入的简单API,同时也支持多个窗口和全屏模式。
GLFW被广泛用于OpenGL程序中,包括游戏、模拟器、三维可视化和科学计算等领域。它可以在Windows、Linux和Mac OS X等多种操作系统上运行。
GLAD是什么?
GLAD是一个开源的C/C++库,用于管理OpenGL函数指针。
它可以生成针对不同的OpenGL版本和扩展的函数指针,从而使得开发人员能够使用OpenGL的最新特性和扩展。
GLAD的优点在于它简单易用,支持多种编译器和操作系统,而且可以根据需要自由定制OpenGL版本和扩展的加载。
在使用GLAD时,用户只需要指定所需的OpenGL版本和扩展即可,GLAD会自动生成相应的函数指针。因此,GLAD通常被用来与GLFW等OpenGL窗口库一起使用,以便在OpenGL应用程序中使用最新的OpenGL功能。
视口是什么?
在OpenGL中,视口(Viewport)是指将场景投影到屏幕上的区域。视口定义了渲染结果在屏幕上的位置和大小。当OpenGL将一个三维场景投影到二维屏幕上时,它会将场景中的三维坐标转换为屏幕上的二维坐标,并将这些坐标限制在视口内,然后在视口中绘制图像。
视口的大小通常与屏幕的大小相同,但是在某些情况下,您可能希望使用不同的视口大小来创建不同的效果。例如,您可能希望在屏幕的左半部分绘制一个场景,而在右半部分绘制另一个场景。在这种情况下,您可以通过设置不同的视口来实现这一点。
您可以使用OpenGL的glViewport函数来设置视口的位置和大小。该函数需要四个参数:视口的左下角的x和y坐标,以及视口的宽度和高度。例如,以下代码将设置视口为屏幕的左上角,大小为屏幕的一半:
glViewport(0, 0, screenWidth/2, screenHeight/2);
这将告诉OpenGL将场景渲染到左上角的四分之一屏幕中。
双缓冲是什么?
应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。
为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。
当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。
二、创建一个窗口
详见“你好,窗口”。
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);
// 窗口大小设置
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
int main()
{
// 实例化GLFW窗口
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
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);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
//GLAD是用来管理OpenGL的函数指针的,在调用任何OpenGL的函数之前我们需要初始化GLAD。
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
// 渲染循环
while (!glfwWindowShouldClose(window))
{
// 处理输入事件
processInput(window);
// 渲染
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
// 处理键盘事件
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
// 根据窗口大小改变视口大小
glViewport(0, 0, width, height);
}
glClearColor | 状态设置函数。用来设置清空屏幕所用的颜色 |
glClear | 状态使用函数。清除颜色缓冲之后,整个颜色缓冲都会被填充为glClearColor里所设置的颜色。 |
本文来自博客园,原创作者:Clemens,转载请注明原文链接:https://www.cnblogs.com/errorman/p/17225654.html