首页 > 其他分享 >LearnOpenGL (1) 创建窗口

LearnOpenGL (1) 创建窗口

时间:2023-03-17 10:47:43浏览次数:56  
标签:窗口 OpenGL 创建 视口 LearnOpenGL 缓冲 GLFW 屏幕

本文基于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里所设置的颜色。

 

标签:窗口,OpenGL,创建,视口,LearnOpenGL,缓冲,GLFW,屏幕
From: https://www.cnblogs.com/errorman/p/17225654.html

相关文章