OpenGL中设置视口画布的函数

125 阅读2分钟

使用的函数

函数接口功能
glViewport规定视口大小
glClearColor设置画布清理的颜色
glClear(GL_COLOR_BUFFER_BIT)执行画布清理操作
glfwSwapBuffers(window)执行双缓存的切换

代码

#include <iostream>
#include <glad/glad.h>

#include <GLFW/glfw3.h>

// 声明且实现一个响应窗体大小变化的函数
void frameBufferSizeCallBack(GLFWwindow* window, int width, int height)
{
    std::cout << "窗体最新大小" << width << "," << height << std::endl;

    // 窗体大小变化的时候也要更新下视口,让视口跟着一起变化
    glViewport(0, 0, width, height);
}


// 声明且实现一个键盘消息回调函数
// key代表字母按键码
// scancode 代表物理按键码,就是所按的键在键盘上的物理位置,很少使用
// action 表示按下还是抬起
// mods表示是否有shift或ctrl
void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods)
{
    if (key == GLFW_KEY_W)
    {
        std::cout << "按下了GLFW_KEY_W"  << std::endl;
    }

    std::cout << "按下了:" << key << std::endl;
}

int main() {

    // 1 初始化GLFW基本环境
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);  // 设置OpenGL的主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);  // 设置OpenGL的次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 设置OpenGL启用核心模式(非立即渲染模式)


    // 2 创建窗体对象
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGLLearn", nullptr, nullptr);

    glfwMakeContextCurrent(window);  // 设置当前窗体对象为OpenGL的绘制舞台

    glfwSetFramebufferSizeCallback(window, frameBufferSizeCallBack);  // 设置监听,监听窗体大小变化

    glfwSetKeyCallback(window, keyCallBack);  // 设置监听,监听键盘消息


    // 使用glad加载所有当前版本OpenGL的函数

    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))  // 向gladLoadGLLoader传一个加载函数
    {
        std::cout << "Failed to init GLAD" << std::endl;

        return  -1;
    }

    // 设置OpenGL视口以及清理颜色
    glViewport(0, 0, 800, 600);
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);


    // 3 执行窗体循环

    while (!glfwWindowShouldClose(window))
    {
        // 接收并分发窗体消息
        // 检查消息队列是否有需要处理的鼠标,键盘等消息
        // 如果有的话就将消息批量处理,清空队列
        glfwPollEvents();


        // 执行OpenGL画布清理操作
        glClear(GL_COLOR_BUFFER_BIT);

        // 渲染操作


        // 切换双缓存
        glfwSwapBuffers(window);
    }


    // 4 退出程序前做相关清理
    glfwTerminate(); 


    return 0;
}

运行效果

image.png