首页 > 系统相关 >Linux OpenGL (2) —— 创建窗口

Linux OpenGL (2) —— 创建窗口

时间:2023-12-22 16:25:19浏览次数:35  
标签:窗口 OpenGL int window GLFW Linux glfwWindowHint

# 编译命令写在前面:
g++ -o out main.cpp lib/glad.c -lglfw -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor

初始化 GLFW 配置需要使用的 OpenGL 版本并启用核心开发模式

// main.cpp
#include <glad/glad.h>      // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>

int main(){
    // 初始化 GLFW
    glfwInit();
    // glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // 设置 OpenGL 的主版本为 3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                  // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用 OpenGL 的核心开发模式

    return 0;
}

// hint n. 暗示,提示

创建窗口并配置上下文

GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL);// 创建窗口,前三个参数依次是 宽、高、窗口名称
if(window==NULL){
	std::cout<< "Failed to create window with glfw.\n";
	glfwTerminate();// 如果窗口创建失败,则结束 GLFW
	return -1;
}
glfwMakeContextCurrent(window);// 通知 GLFW 我们将使用该窗口。也被称为设置窗口上下文。

解决窗口缩放问题

void frameBufferSizeCallback(GLFWwindow* window, int width, int height){}// 设置窗口缩放的回调函数
glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册

初始化 glad

if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){// 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
	std::cout<< "Failed to initalize glad.\n";      // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
	return -1;
}

设置渲染窗口并让渲染窗口随 GLFW 窗口一同缩放

// 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高
// 在回调函数中重新设置渲染窗口的大小和位置
void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}

让窗口持续存在

我们之前所写的程序编译后执行会什么都看不见,其实它只生成了一帧窗口,然后马上就消失掉了。所以我们看不见。因此需要让窗口被持续渲染。

while(!glfwWindowShouldClose(window)){     // 检查窗口是否需要被关闭
	glfwSwapBuffers(window);           // 交换颜色缓冲区,负责更新每一帧的颜色
	glfwPollEvents();                  // 监听用户的交互事件,鼠标、键盘输入等
}

释放资源

最后,释放掉所有的窗口和资源

glfwTerminate();                          // 删除之前配置的所有资源

完整程序

#include <glad/glad.h>      // glad 头文件必须放在所有头文件之前
#include <GLFW/glfw3.h>
#include <iostream>

void frameBufferSizeCallback(GLFWwindow* window, int width, int height);

int main(){
    // 初始化 GLFW
    glfwInit();
    // glfwWindowHint 的第一个参数代表需要配置的选项,第二个参数是配置的值
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);                  // 设置 OpenGL 的主版本为 3
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);                  // 设置 OpenGL 的子版本为 3。这样我们就会使用 OpenGL 3.3 版本
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);  // 使用 OpenGL 的核心开发模式

    GLFWwindow* window = glfwCreateWindow(800, 600, "opengl test window", NULL, NULL);  // 创建窗口,前三个参数依次是 宽、高、窗口名称
    if(window==NULL){
        std::cout<< "Failed to create window with glfw.\n";
        glfwTerminate();                                                                // 如果窗口创建失败,则结束 GLFW
        return -1;
    }
    glfwMakeContextCurrent(window);                                 // 通知 GLFW 我们将使用该窗口

    if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){        // 在使用任何 OpenGL 函数之前,必须加载并初始化他们的管理库 glad
        std::cout<< "Failed to initalize glad.\n";                  // 所以,在使用函数之前,判断 glad 是否被成功加载并初始化
        return -1;
    }

    // 设置渲染窗口的尺寸。注意 GLFW 的窗口是整体的显示窗口,我们也可以将渲染窗口设置的比 GLFW 窗口小,这样我们就可以在窗口剩余部分显示其他数据。
    glViewport(0, 0, 800, 600); // 前两个参数为渲染窗口左下角的坐标,后两个参数为渲染窗口的宽和高

    glfwSetFramebufferSizeCallback(window, frameBufferSizeCallback);// 将回调函数注册

    while(!glfwWindowShouldClose(window)){                          // 检查窗口是否需要被关闭
        glfwSwapBuffers(window);                                    // 交换颜色缓冲区,负责更新每一帧的颜色
        glfwPollEvents();                                           // 监听用户的交互事件,鼠标、键盘输入等
    }

    glfwTerminate();                                                // 删除之前配置的所有资源

    return 0;
}

// hint n. 暗示,提示
// g++ -o out main.cpp lib/glad.c -lglfw -lGL -lm -lXrandr -lXi -lX11 -lXxf86vm -lpthread -ldl -lXinerama -lXcursor

void frameBufferSizeCallback(GLFWwindow* window, int width, int height){glViewport(0, 0, width, height);}// 设置回调函数

编译运行后,会得到一个黑色窗口:

image

标签:窗口,OpenGL,int,window,GLFW,Linux,glfwWindowHint
From: https://www.cnblogs.com/torch-hxm/p/17921656.html

相关文章

  • 快速窗口定位功能
    HHDBCS及HHDESK都设置有快速窗口定位功能,支持用户快速定位到已经打开的窗口。点击软件右侧的小扳手,弹出对话框;可进行搜索;......
  • linux环境下nginx配置http2
    由于项目需求,在nginx下支持http2协议,希望提升访问性能。除了介绍配置过程,在文章最后会记上过程中的困惑。准备工作nginx-1.19.2.tar.gzopenssl-1.0.2r.tar.gz(必须不低于1.0.2,否则不支持http2)以上文件上传到/usr/local目录下。开始安装安装nginx#解压openssl>tar-zxv......
  • Linux OpenGL (1)——环境搭建(GLFW, glad)
    所有代码和过程都已经过测试测试环境:UbuntuWSL18.04为什么需要GLFW和glad库我粗浅的理解:opengl并没有提供一些跨平台代码的实现细节,因此,需要根据不同的平台下载一些库来填充opengl中“空虚”的函数。如何安装GLFW和glad库安装GLFW#安装GLFWsudoapt-get......
  • QCN9024|Wallys DR9074-TRIBAND Now Supported by ATH11K for Enhanced Linux Compati
    QCN9024|WallysDR9074-TRIBANDNowSupportedbyATH11KforEnhancedLinuxCompatibility!WallysisthrilledtoannouncethatourDR9074-TRIBANDisnowsupportedbyATH11K.ThisnotonlyextendsitsusabilitybeyondQualcommplatformsbutopensdoorsforint......
  • 如果你希望打包的Python脚本在运行时不显示命令行窗口,你可以在使用`auto-py-to-exe`进
    auto-py-to-exe是一个基于Eel和PyInstaller构建的工具,可以通过简单的UI界面将Python项目中的.py文件打包为.exe文件¹。以下是使用auto-py-to-exe的步骤:环境要求:Python环境需要大于或等于2.7¹。模块安装:在命令行中输入以下命令来安装auto-py-to-exe¹:pipinstallauto-py-to-exe或......
  • 盘点Linux系统中常用的防火墙工具!
    防火墙是一种网络安全工具,它可以控制网络通信并保护系统免受网络攻击,因此Linux系统也会采用防火墙来保护自己免受攻击。那么Linux中常用的防火墙工具有哪些?以下是具体内容介绍。以下是几个常用的防火墙工具推荐:1、iptables:iptables是Linux上最常用的防火墙工具之一。......
  • Linux中大括号主要作用是什么?需要注意哪些?
    在Linux中,不同的括号有着不同的作用。那么Linux中的大括号代表什么意思?在Linux中,大括号是一种有着特定作用和用途的符号,其具有强大的扩展功能,可以帮助用户快速完成相关工具,接下来我们来看看具体的内容介绍。在Linux中,大括号用于扩展和重复命令、生成文件列表以及进行字符......
  • Linux内核在RISC-V架构下的spinlock实现
    riscv没有sev/wfe指令,当前无法在spinlock时省功耗,只能通过while循环不断检查条件。本文分析linux内核下对于spinlock的实现,具体到RISC-V体系结构。由于RISC-V体系结构下目前只是简单的实现了一个基于TAS的最基本的spinlock,本文的另一个附加任务就是分析Linux内核为各个平台下实......
  • linux下域名解析工具
    1、dig[root@hlcc_mastermysqlinit]#digwww.baidu.com;<<>>DiG9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13<<>>www.baidu.com;;globaloptions:+cmd;;Gotanswer:;;->>HEADER<<-opcode:QUERY,status:NOERROR,id:723......
  • linux 如何删掉一些特殊字符的文件夹,比如带有空格,单引号,双引号的
    在Linux中删除包含特殊字符(如空格、单引号、双引号)的文件夹,你需要使用转义字符或引号来正确地指定文件夹名。以下是一些常用方法:使用反斜杠(\)转义特殊字符:如果文件夹名包含空格,比如MyFolder,你可以使用\来转义空格:rm-rMy\Folder/对于包含单引号或双引号的文件夹,同样......