当前位置: 首页 > ops >正文

【OpenGL】LearnOpenGL学习笔记01 - 环境配置、窗口创建

最近看完了GAMES101,接下来准备熟悉一下图形API~
先从OpenGL入手,找到了网站 LearnOpenGL
在此简要的记录一下,方便以后查阅

一、环境配置

1. GLFW
GLFW是一个针对OpenGL的C语言库,它提供了一些渲染所需的最低限度的接口。我们可以通过它创建OpenGL上下文、定义窗口以及处理用户输入等。
可以在 GLFW 上下载源码或是编译好的文件

2.GLAD
实际上OpenGL是一个标准或是规范,其具体的实现是由驱动开发商针对不同的显卡实现的。因而OpenGL大多数的函数位置都无法在编译时确定下来,需要我们在运行时进行查询。并且在不同的平台上,取得函数地址的方法也不同,如Windows平台:

// 定义函数原型
typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*);
// 找到正确的函数并赋值给函数指针
GL_GENBUFFERS glGenBuffers  = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");
// 现在函数可以被正常调用了
GLuint buffer;
glGenBuffers(1, &buffer);

GLAD就是帮我们简化和封装这个过程的一个库,我们可以在 GLAD 上生产库文件
本文以版本3.3为例,Profile设置为Core并勾选Generate a loader后点击Generate

3.VS工程
接下来创建一个VS C++ 空工程,取名为OpenGLRenderer
在这里插入图片描述
然后右键项目属性在VC++目录中设置我们的头文件包含目录以及Lib目录,将GLFW和GLAD配置进去
OpenGL环境配置
然后选择链接器,在附加依赖项中配置glfw3.libopengl32.lib
对于Windows平台,opengl32.lib已经包含进Microsoft SDK中了,尽管它的名称中包含32,但是64位的版本也是用它
OpenGL环境配置
到这一步,环境配置就完成了~

二、窗口创建

直接上代码

#include <iostream>// 注意顺序,glad中有依赖检查
// 顺序错误编译会报错 #error:  OpenGL header already included, remove this include, glad already provides it
#include <glad/glad.h>
#include <GLFW/glfw3.h>// 输入处理
void ProcessInput(GLFWwindow* window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE)){glfwSetWindowShouldClose(window, true);}
}// 窗口大小改变回调
void OnSetFrameBufferSize(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}int main()
{// glfw初始化glfwInit();// glfw设置OpenGL版本为3.3glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);// glfw设置OpenGL为核心(Core)模式// 核心模式相较于立即渲染模式(Immediate mode,也就是固定渲染管线,现已废弃),拥有更高的灵活性glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow* window = glfwCreateWindow(1280, 720, "OpenGLRenderer", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// 设置为当前上下文glfwMakeContextCurrent(window);// 初始化glad加载器if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 注册窗口大小改变回调glfwSetFramebufferSizeCallback(window, OnSetFrameBufferSize);// 主循环while (!glfwWindowShouldClose(window)){// 清屏glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// 输入处理ProcessInput(window);// ...之后会做其他事情// 双缓冲切换glfwSwapBuffers(window);// 检查事件触发,如窗口大小改变,调用对应回调函数glfwPollEvents();}// 资源清理glfwTerminate();return 0;
}

编译执行,顺利的话会看见以下窗口
GLFW窗口创建

http://www.xdnf.cn/news/16845.html

相关文章:

  • Flask + YARA-Python*实现文件扫描功能
  • 开源列式分布式数据库clickhouse
  • 深入 Go 底层原理(十三):interface 的内部表示与动态派发
  • Redisson高并发实战:Netty IO线程免遭阻塞的守护指南
  • 算法提升之数学(快速幂+逆元求法)
  • 【20min 急速入门】使用Demucs进行音轨分离
  • Redis7 String类型数据
  • 【iOS】KVO
  • MyBatisPlus之CRUD接口(IService与BaseMapper)
  • 28Rsync免密传输与定时备份
  • 关于Web前端安全防御XSS攻防的几点考虑
  • Spring Boot 全 YAML 配置 Liquibase 教程
  • C++之vector类的代码及其逻辑详解 (中)
  • DockerFile文件执行docker bulid自动构建镜像
  • CMake指令:mark_as_advanced
  • Python序列去重高级指南:保持顺序的高效去重技术
  • 错误: 找不到或无法加载主类 原因: java.lang.ClassNotFoundException
  • 云原生三剑客:Kubernetes + Docker + Spring Cloud 实战指南与深度整合
  • 分类任务当中常见指标 F1分数、recall、准确率分别是什么含义
  • 类似 Pixso 但更侧重「网页 / 软件界面设计」「前后端可视化开发」的工具
  • 【贪心】P11112 [ROI 2024] 机器人物流 (Day 1)|普及+
  • 基于python多光谱遥感数据处理、图像分类、定量评估及机器学习方法应用
  • Java函数式编程之【Stream终止操作】【下】【二】【收集器toMap()】【叁参数收集操作collect()】
  • Maven项目和Spring项目的异同
  • 企业资产|企业资产管理系统|基于springboot企业资产管理系统设计与实现(源码+数据库+文档)
  • Docker容器中文PDF生成解决方案
  • 计算机网络:为什么IPv6没有选择使用点分十进制
  • Pytorch-02数据集和数据加载器的基本原理和基本操作
  • Matplotlib - Python图表可视化利器
  • 面试小总结