OpenGL之创建窗口

news2025/1/13 3:07:52

目录

什么是OpenGL?

核心模式与立即渲染模式

立即渲染模式 (Immediate mode)

核心模式(Core-profile)

状态机

对象

创建窗口 

配置环境 


什么是OpenGL?

  一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。

核心模式与立即渲染模式

立即渲染模式 (Immediate mode)

  早期的OpenGL使用的模式(也就是固定渲染管线)  OpenGL的大多数功能都被库隐藏起来,容易使用和理解,但是效率太低。 开发者很少能控制OpenGL如何进行计算 因此从OpenGL3.2开始,推出核心模式。

核心模式(Core-profile)

  也叫可编程管线,提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

状态机

OpenGL自身是一个巨大的状态机 变量(描述该如何操作)的大集合 OpenGL的状态通常被称为上下文(Context)。 状态设置函数(State-changing Function) 状态应用的函数(State-using Function)。

对象

OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个。

创建窗口 

不同操作系统上,创建支持OpenGL的窗口接口不同。需要我们自己处理创建窗口,定义OpenGL上下文以及处理用户输入。不同操作系统,不同显卡获取OpenGL函数的接口也有差异。

GLFW库解决操作系统层面的不同 创建窗口 定义上下文 处理用户输入。

GLAD库使得代码可以用于不同的OpenGL驱动 OpenGL本身只是标准/规范 各个厂家具体实现方式可以不同。

如果没有类似GLAD的库,windows下:

配置环境 

首先打开vs创建工程,然后右击工程的属性。

将 glfw库和glad库的头文件路径选择进来。

然后配置库文件的路径。

在Windows上,请使用OpenGL库opengl32.lib(随Microsoft SDK一起提供,在安装Visual Studio时默认安装)。 

然后添加glad的源文件。 

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

void processInput(GLFWwindow* window);

int main()
{
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__ 
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
	if (window == NULL) {
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	//GLFW将窗口的上下文设置为当前线程的上下文
	glfwMakeContextCurrent(window);

	//GLAD
	// glad: 加载所有OpenGL函数指针
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}
	// 渲染循环
	while (!glfwWindowShouldClose(window)) {
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f); //状态设置
		glClear(GL_COLOR_BUFFER_BIT); //状态使用
		processInput(window);
		// glfw: 交换缓冲区和轮询IO事件(按键按下/释放、鼠标移动等)
		glfwSwapBuffers(window);
		glfwPollEvents();
	}
	// glfw: 回收前面分配的GLFW先关资源. 
	glfwTerminate();

	return 0;
}

void processInput(GLFWwindow* window) 
{
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
}

此代码是显示暗绿色窗口的代码,用于测试配置环境。

最后分享一下glad库和glfw库的百度网盘链接。

链接:https://pan.baidu.com/s/1QYk3zhQUgzNJBXVTE-n3Sg 
提取码:0z63

参考:

主页 - LearnOpenGL CN

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/533599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑客最常用的10款黑客工具

以下所有这些工具都是捆绑在一起的Linux发行版&#xff0c;如Kali Linux或BackBox&#xff0c;所以我们一定会建议您安装一个合适的Linux黑客系统&#xff0c;使您的生活更轻松 - 尤其是因为这些黑客工具可以&#xff08;自动&#xff09;更新。 1、Nikto&#xff08;网站漏洞…

中断与freeRTOS任务进行同步

S32K144在做CAN通信时&#xff0c;通过FlexCAN中断接收CAN数据&#xff0c;并希望让freeRTOS 的CAN处理任务拿到CAN数据并进行数据处理。因此就需要找到能够满足中断与freeRTOS任务进行同步的方式方法。 遇到这个问题&#xff0c;第一时间想到的就是查找freeRTOS手册《FreeRTO…

Spring 拦截器

目录 今日良言&#xff1a;心若有所向往&#xff0c;何惧道阻且长 一、Spring 拦截器 1.拦截器简介 2.实现自定义拦截器 今日良言&#xff1a;心若有所向往&#xff0c;何惧道阻且长 一、Spring 拦截器 1.拦截器简介 Spring Boot 拦截器是面向切面编程-----AOP 的具体实现…

人工智能基础部分17-隐马尔科夫模型在序列问题的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分16-隐马尔科夫模型在序列问题的应用&#xff0c;隐马尔可夫模型(HMM)是一种统计模型&#xff0c;广泛应用于各种领域&#xff0c;如语音识别、自然语言处理、生物信息学等。本文将介绍隐马尔可夫模…

杂记——25.eclipse如何连接并实现对数据库的操作

这篇文章我们来讲一下eclipse&#xff08;即编辑器&#xff09;如何连接并实现对数据库的操作&#xff0c;这里以eclipse为主连讲解演示一下。 第一步&#xff1a; 查看我们本机安装的数据库的版本&#xff0c;即查看我们本机是否安装了数据库 在命令提示窗口输入&#xff1…

games103——作业3

实验三主要使用FEM和hyperelastic模型完成弹性体的模拟 完整项目已上传至github。 文章目录 Linear finite element method(FEM)二维空间有限元方法变形梯度(Deformation Gradient)格林应变(Green Strain)应变能量密度函数(Strain Energy Density Function)力(Force) Finite Vo…

威胁猎人 | 2018年上半年国内公有云云上资产合规现状报告

声明&#xff1a;本报告版权属于威胁猎人情报中心&#xff0c;并受法律保护。转载、摘编或利用其它方式使用本报告文字或者观点的&#xff0c;应注明“来源&#xff1a;威胁猎人”。违反上述声明者&#xff0c;将追究其相关法律责任。 一、报告背景 自2005年亚马逊发布AWS伊始…

基于nodejs+vue3 的高仿网易云音乐

大家好&#xff0c;我是小寻&#xff0c;欢迎大家关注我的公众号&#xff1a;工具优选&#xff0c;加入前端、java群聊哦&#xff01; 今天给大家分享一个超高水准的项目&#xff1a;基于nodejsvue3研发的高仿网易云音乐&#xff0c;项目内容出自寻码网&#xff01; 技术栈&a…

行业唯一丨冠珠瓷砖荣获人民日报社“ESG年度案例”

践行社会责任&#xff0c;推动品牌高质量发展。5月11日&#xff0c;由人民日报社指导、人民日报社经济社会部主办的“中国企业社会责任高峰论坛”在上海盛大举行。 本次论坛围绕乡村振兴、共同富裕、绿色低碳等重点议题进行深入研讨&#xff0c;邀请国家发展和改革委员会、商务…

Thread线程学习(2) Linux线程的创建、终止和回收

目录 1.首先要了解什么是线程ID&#xff0c;以及它的作用是什么 2.创建线程 3.终止线程 4.回收线程 5.总结 在Linux系统中&#xff0c;线程是轻量级的执行单元&#xff0c;能够在同一个进程中并发执行。本文将介绍如何在Linux环境下创建、终止和回收线程&#xff0c;并提供…

〖Web全栈开发③〗—HTTP协议和静态web服务器

HTTP协议和静态web服务器 &#xff08;一&#xff09;三次握手和四次挥手&#xff08;二&#xff09;HTTP协议2.1 HTTP协议的定义2.2 HTTP协议的组成 &#xff08;三&#xff09;搭建python自带静态web服务器3.1 静态web服务器是什么3.2 如何搭建python自带的静态web服务器3.3 …

【栈和队列】的特性以及基本接口的实现

目录 一、栈 1.1 栈的概念 1.2 栈的接口实现 二、队列 2.1 队列的概念 2.2 队列的接口实现 2.3 栈和队列的区别 三、栈和队列LeetCode练习 3.1 力扣_232.用栈实现队列 3.2 力扣_225.用队列实现栈 3.3 力扣_622.设计循环队列 3.4 力扣_20.有效的括号 一、栈 第一次学…

电容在电路中的作用

电容、也称为电容器&#xff0c;字面意思理解就是一种“装电的容器”&#xff0c;是一种容纳电荷的器件。它拥有两个电极板&#xff0c;由两个电极板及其中间所夹的介质封装而成。 常用电容极性判断&#xff1a;   铝电解电容&#xff1a;长脚为正极&#xff0c;短脚为负极&…

【MySQL学习】MySQL索引特性

文章目录 一、初识MySQL索引1.1 MySQL索引的概念1.2 MySQL索引的作用 二、MySQL的数据存储2.1 MySQL存储与磁盘之间的关系2.2 MySQL与磁盘交互的基本单位2.3 认识数据页Page 三、索引的理解3.1 测试案例3.2 探究单个和多个Page存储数据时的情况3.3 页目录3.4 为什么InooDB存储引…

《面试1v1》CAS

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 面试官&#xff1a; 上个面试官对你的基础有了一定了解&#xff0c;听说你小子很不错&#xff01;下面我们聊点有深度的。 面试官&#xff1a; 简单介绍下 CAS 你了…

10款Photoshop免费在线工具推荐

AdobePhotoshop下载繁琐&#xff0c;付费昂贵&#xff0c;让很多设计师望而却步&#xff01; 经过几个小时的筛选和测试&#xff0c;筛选出10款Photoshop免费在线工具&#xff0c;与Photoshop一样强大。让我们看看&#xff01; 1.即时设计 智能抠图 当我们想要去重图片背景&…

【鲁棒优化、机会约束】具有分布鲁棒联合机会约束的能源和储备调度研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JAVA中的深情哥-Exception(异常)-上

文章目录 目录 文章目录 前言 一&#xff0c;Exception的起源 二&#xff0c;异常类 三&#xff0c;自定义异常 总结 前言 大家好,我是最爱吃兽奶,今天给大家介绍一下java中的深情哥 - Exception 秋风依依秋水寒&#xff0c;一点离愁两黯然&#xff1b;今生默默唯轻舞&a…

抖音林客系统开发

抖音林客系统是一款基于AI技术的推荐算法系统&#xff0c;主要应用于抖音平台中用户的内容推荐和个性化服务。开发抖音林客系统需要掌握以下关键技术&#xff1a; 数据采集与处理&#xff1a;需要对海量的用户数据进行采集和处理&#xff0c;包括用户的观看历史、互动行为、…