opengl 学习(一)-----创建窗口

创建窗口

  • 分类
  • opengl 学习(一)-----创建窗口
  • 效果
  • 解析
  • 教程
  • 补充

分类

c++ opengl

opengl 学习(一)-----创建窗口

  • demo:
#include "glad/glad.h"
#include "glfw3.h"
#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

//响应窗体大小变化的回调
//参数的意思:哪一个窗口发生了变化:变化后的宽高
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    //std::cout<<"窗口最新大小:"<<width<<","<<height<<std::endl;
    glViewport(0, 0, width, height);
}

//响应键盘的回调函数
void keyCallBack(GLFWwindow* window, 
    int key, 
    int scancode, 
    int action, 
    int mods)
{
    //键盘事件响应
    //key:字母按键码
    //scancode不用管
    //action:按下还是抬起
    //mods:是否有shift或ctrl
    if (key == GLFW_KEY_Q)
    {
        std::cout << "按下了:" << key << std::endl;
    }
    if (key == GLFW_PRESS)
    {
        //按键按下
    }
    if (key == GLFW_RELEASE)
    {
        //按键抬起
    }
    if (key == GLFW_MOD_CONTROL)//control
    {
        //按下ctrl的同时,按下了key
    }
    if (key == GLFW_MOD_SHIFT)
    {
        //按下shift的同时,按下了key
    }
}

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

int main()
{
    glfwInit();//调用glfwInit函数来初始化GLFW
    //然后我们可以使用glfwWindowHint函数来配置GLFW
    //glfwWindowHint函数的第一个参数代表选项的名称,我们可以从很多以GLFW_开头的枚举值中选择;
    // 第二个参数接受一个整型,用来设置这个选项的值

    //该函数的所有的选项以及对应的值都可以在下面这篇文档中找到,
    // 反正我是看不懂,你可以尝试去看一下
    //https://www.glfw.org/docs/latest/window.html#window_hints
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//opengl环境的主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//opengl环境的次版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//使用核心模式

    //我们同样明确告诉GLFW我们使用的是核心模式(Core-profile)。
    // 明确告诉GLFW我们需要使用核心模式意味着我们只能使用OpenGL功能的一个子集(没有我们已不再需要的向后兼容特性)

    //核心模式是3.3之后,之前的是传统模型,是不兼容的


    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);//设置当前窗口为opengl绘制的舞台,你可以创建很多个窗口


    //OPengl的专属窗口大小变化回调语法:glfwSetFramebufferSizeCallback
    //参数的含义:哪个窗体响应的窗体大小
    glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
    //OPengl的专属键盘回调语法:glfwSetKeyCallback
    //参数的含义:哪个窗体响应的键盘事件
    glfwSetKeyCallback(window, keyCallBack);

    //在之前的教程中已经提到过,GLAD是用来管理OpenGL的函数指针的,
    // 所以在调用任何OpenGL的函数之前我们需要初始化GLAD。
    if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
    {
        std::cout << "Failed to initialize GLAD" << std::endl;
        return -1;
    }


    //while (!glfwWindowShouldClose(window))//glfwWindowShouldClose函数在我们每次循环的开始前检查一次GLFW是否被要求退出
    //{
    //    glfwSwapBuffers(window);// glfwPollEvents函数检查有没有触发什么事件(比如键盘输入、鼠标移动等)、更新窗口状态
    //    glfwPollEvents();//glfwSwapBuffers函数会交换颜色缓冲
    //}


    // 渲染循环
    while (!glfwWindowShouldClose(window))
    {
        // 输入
        processInput(window);

        // 渲染指令
        glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        // 检查并调用事件,交换缓冲
        glfwPollEvents();//接收并分发窗口信息
        glfwSwapBuffers(window);
    }

    glfwTerminate();//用于退出程序
    return 0;
}

效果

请添加图片描述

解析

程序在进行窗口循环while (!glfwWindowShouldClose(window))
每次一次循环是渲染了一帧
在这里插入图片描述
GLFW其实就是给opengl提供一个窗口

Glad是确定你驱动上opengl上的版本

教程

在此感谢b站大学让我能够解除到这么有意思的图形库

  1. https://www.bilibili.com/video/BV1aK4y1z7ii/?spm_id_from=333.788&vd_source=b0ae72e5d408bb143449717af5dd95af
  2. https://www.bilibili.com/cheese/play/ep211557
  3. https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/

补充

其实上面写太乱了,下面写个简单的

#include "glad/glad.h"
#include "glfw3.h"
#include <iostream>
#include <cmath>
#include <vector>

using namespace std;



int main()
{
    //1.初始化GLFW基本环境
    glfwInit();
    //1.1设置Opengl主次版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    //1.2设置核心渲染模式(非立即渲染模式)
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


    //2.创建窗体对象
    GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (window == NULL)
    {
        std::cout << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    //设置当前窗体对象为 OPengl的绘制舞台
    glfwMakeContextCurrent(window);
    

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

    //退出程序前做相关的资源清理
    glfwTerminate();


    return 0;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能控制:物联网智能插座对接文档

介绍 一开始买的某米的插座&#xff0c;但是好像接口不开放&#xff0c;所以找到了这个插座&#xff0c;然后自己开发了下&#xff0c;用接口控制插座开关。wifi的连接方式&#xff0c;通电后一般几秒后就会连接上wifi&#xff0c;这个时候通过接口发送命令给他。 产品图片 通…

第十篇:复习maven

文章目录 一、什么是Maven1. 依赖管理2. 统一项目结构3. 项目构建4. 依赖的仓库 二、IDEA集成Maven1. Maven简单的安装和配置2. 配置Maven环境3. 创建Maven项目4. Maven坐标4. 导入Maven项目 三、依赖管理1. 依赖配置2. 依赖传递3. 依赖范围4. 生命周期 四、小结 一、什么是Mav…

SAP MM学习笔记 - 错误 BMG140 - The material number is longer than the length set

错误 BMG140 - The material number is longer than the length set 品目编号大于长度设置 1&#xff0c;在新规品目的时候&#xff0c;出的错 2&#xff0c;OMSL 品目Code书式变更 IMG path>Logistic general>Material Master>Basic settings>Define output for…

【Web前端入门学习】—CSS

目录 CSS简介CSS语法CSS三种导入方式CSS选择器元素选择器&#xff08;标签选择器&#xff09;类选择器ID选择器通用选择器子元素选择器后代选择器&#xff08;包含选择器&#xff09;并集选择器&#xff08;兄弟选择器&#xff09;伪类选择器伪元素选择器 CSS常用属性盒子模型网…

TabLayout预览不了?

<TableLayoutandroid:layout_width"wrap_content"android:layout_height"wrap_content"/> 当然预览不了了&#xff0c;这其实不是我要的控件。 而实际需要的是TabLayout 不是TableLayout &#xff01;&#xff01;&#xff01; <com.google.an…

机器学习——感知机模型

机器学习系列文章 入门必读&#xff1a;机器学习介绍 文章目录 机器学习系列文章前言1. 感知机1.1 感知机定义1.2 感知机学习策略 2. 代码实现2.1 构建数据2.2 编写函数2.3 迭代 3. 总结 前言 大家好&#xff0c;大家好✨&#xff0c;这里是bio&#x1f996;。这次为大家带来…

lvs+keepalive

虚拟路由冗余协议(Virtual Router Redundancy Protocol&#xff0c;简称VRRP) VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器的IP地址为默认网关&#xff0c;实现网关的备份。 协议版本: VRRPv2&#xff08;常用&…

日常生活小技巧 -- USR-TCP232-M4(读取IP)

下载&#xff1a;[Configuration Software]USR-TCP232-M4_V2.3.4.106

Vue2+3

vue相关介绍 Vue的两种使用方式&#xff1a; 1、vue核心包开发 场景&#xff1a;局部模块改造 2、vue核心包&vue插件工程化开发 场景&#xff1a;整站开发 概念&#xff1a;vue是用于构建用户界面的渐进式框架 创建vue实例 创建Vue实例&#xff0c;初始化渲染步骤&am…

Unity类银河恶魔城学习记录8-4 P80 Blackhole ability state源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic…

Windows系统获取硬盘读写速度(固态、机械通用)

管理员身份运行cmd&#xff0c;注意不要用powershell&#xff0c;可能会闪退 运行命令 winsat disk -drive C 获得C盘的读写速度 同理 winsat disk -drive D 可获得D盘的读写性能

【产品文档分类及撰写路径】

一、产品文档的分类 产品文档根据所处阶段和面相对象的差异大致可以分为三类&#xff1a; 商业需求文档 (BRD)&#xff1a;商业需求文档是面向公司高层和项目组&#xff0c;目的是为了获得资金、资源支持。市场需求文档 (MRD)&#xff1a;市场需求文档是面向运营和市场销售人员…

Python读取.csv/.txt文件并画图

文章目录 读取.txt文件并画出每列数据读取.csv文件并画出每列数据python绘图的基本知识补充 读取.txt文件并画出每列数据 main.ipynb //注意文件类型为.ipynbimport matplotlib.pyplot as plt import numpy as npdata np.loadtxt(result.txt) fig plt.figure(dpi100,figsize…

哪个牌子宠物空气净化器好?质量好的宠物空气净化器推荐

即使我们很爱自家的宠物&#xff0c;但我们也无法否认处理房间里飘荡的宠物毛发和皮屑&#xff0c;以及那些令人不快的气味&#xff08;比如地毯上的意外和垃圾桶里的气味&#xff09;的挑战。对于过敏患者来说&#xff0c;这几乎是无法忍受的。寻找有效的方法来减少这些问题对…

四个有用的Android开发技巧

一. 通过堆栈快速定位系统版本 这个地方主要分享大家两个个技巧&#xff0c;通过问题堆栈简快速定位当前系统版本&#xff1a; 1. 快速区分当前系统版本是Android10以下&#xff0c;还是Android10及以上&#xff1b; 首先Android10及以上引入了一个新的服务Service&#xff…

程序异常结束退出 无输出 无显式报错日志 爆栈

需求 开一个很大的数组&#xff08;300万&#xff09; ❗ 错误示例 #include <stdio.h>int main() {int size 3000000;int a[size];a[size-1] 999;printf("%d",a[size-1]);return 0; }&#x1f60b; 解决方案 局部变量存储在栈空间 &#xff08;较小&…

【数据结构】哈希

在一个数据序列中查找某一个数据元素&#xff0c;是数据管理时经常涉及的&#xff0c;通常以比较的方式来完成&#xff0c;典型的案例有无序序列的暴力查找&#xff08;O(N)&#xff09;、有序序列的二分查找&#xff08;O(logN)&#xff09;、平衡搜索树&#xff08;O(logN)&a…

CentOS网络故障排查秘笈:实战指南

前言 作为一名热爱折腾 Linux 的技术达人&#xff0c;我深知网络故障会让人抓狂&#xff01;在这篇文章里&#xff0c;我和你分享了我的心得体会&#xff0c;从如何分析问题、识别瓶颈&#xff0c;到利用各种神器解决网络难题。不管你是新手小白还是老鸟大神&#xff0c;这里都…

Get了!原来朋友圈定时发布如此简单!

你是不是也有这样的烦恼&#xff1f;微信号太多&#xff0c;有时候会顾不上发朋友圈&#xff1f; 别担心&#xff01;微信管理系统来帮你解决这个问题&#xff0c;实现朋友圈定时发布&#xff01;让我们一起来看看如何利用微信管理系统的强大功能来提升我们的社交媒体效率吧。…

Material Studio 中 DMol3 计算材料吸附能

1.先导入Cif文件 2.切表面 3.沿着你要切的晶面切 4.扩胞 5.加真空层&#xff08;一般加10埃&#xff09; 现在就是这样的了 6.然后对其结构优化&#xff08;高斯几何优化&#xff09; 7.再在体系上加原子或者想要的材料 8.Outmal文件中最后的Ef就是整个体系的能量&#xff0…