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

(四)opengl函数加载和错误处理

#include <glad/glad.h>//glad必须在glfw头文件之前包含
#include <GLFW/glfw3.h>
#include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);std::cout << width << "," << height << std::endl;
}
void glfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{}
int main()
{//初始化glfw环境glfwInit();//设置opengl主版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);//设置opengl次版本号glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置opengl启用核心模式glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//创建窗体对象GLFWwindow* window = glfwCreateWindow(800, 600, "lenarnOpenGL", nullptr, nullptr);//设置当前窗体对象为opengl的绘制舞台glfwMakeContextCurrent(window);//窗体大小回调glfwSetFramebufferSizeCallback(window, frameBufferSizeCallbakc);//键盘相应回调glfwSetKeyCallback(window, glfwKeyCallback);//使用glad加载所有当前版本opengl的函数if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "初始化glad失败" << std::endl;return -1;}//设置opengl视口大小和清理颜色glViewport(0, 0, 800, 600);glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//执行窗体循环while (!glfwWindowShouldClose(window)){//接受并分发窗体消息//检查消息队列是否有需要处理的鼠标、键盘等消息//如果有的话就将消息批量处理,清空队列glfwPollEvents();//执行opengl画布清理操作glClear(GL_COLOR_BUFFER_BIT);//渲染操作//切换双缓存glfwSwapBuffers(window);}//推出程序前做相关清理glfwTerminate();return 0;
}

使用gladLoadGLLoader函数可以加载opengl中所有的函数。
glGetError函数可以获取上行代码是否报错以及错误信息:

#include <assert.h>
void checkError() {GLenum errorCode = glGetError();std::string error = "";if (errorCode != GL_NO_ERROR) {switch (errorCode){case GL_INVALID_ENUM: error = "INVALID_ENUM"; break;case GL_INVALID_VALUE:  error = "INVALID_VALUE"; break;case GL_INVALID_OPERATION: error = "INVALID_OPERATION"; break;case GL_OUT_OF_MEMORY: error = "OUT OF MEMORY"; break;default:error = "UNKNOWN";break;}std::cout << error << std::endl;//assert会根据传入的bool值,来决定程序是否停止//true:程序顺利运行//false:程序会断死assert(false);}
}

在OpenGL中,双缓存(Double Buffering)通常用于消除图像闪烁和提高渲染效率。OpenGL默认情况下使用双缓存来进行渲染。
双缓存指的是使用两个缓存区来交替渲染画面:

  • 前缓存(Front Buffer):显示器当前显示的图像内容。
  • 后缓存(Back Buffer):用于绘制新的图像内容。

在绘制完成后,将后缓存的内容交换到前缓存,以避免用户看到图像绘制的过程,从而避免闪烁和视觉不连续性。

相关文章:

  • 【RNN练习】LSTM-火灾温度预测
  • 【软考论文】论基于架构的软件设计方法及应用(ABSD)
  • 【C++】数组、字符串
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • 【ajax实战08】分页功能
  • Lua博客网站支持搜索、评论、登录注册
  • postman
  • linux 下neo4j的安装
  • 重榜:鸿蒙 Charles 抓包设置
  • 安卓实现微信聊天气泡
  • springboot集成gzip和zip数据压缩传输-满足2k数据自动压缩(适用大数据信息传输)
  • c++将一个复杂的结构体_保存成二进制文件并读取
  • Spark2.0
  • 简单爬虫案例——爬取快手视频
  • BMA530 运动传感器
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【node学习】协程
  • Angular 响应式表单 基础例子
  • download使用浅析
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6之路之模块详解
  • HTML中设置input等文本框为不可操作
  • Puppeteer:浏览器控制器
  • Vim 折腾记
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 规范化安全开发 KOA 手脚架
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 面试总结JavaScript篇
  • 浅谈web中前端模板引擎的使用
  • 如何胜任知名企业的商业数据分析师?
  • 手机app有了短信验证码还有没必要有图片验证码?
  • Java性能优化之JVM GC(垃圾回收机制)
  • 阿里云ACE认证学习知识点梳理
  • 阿里云ACE认证之理解CDN技术
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #if #elif #endif
  • (3)选择元素——(17)练习(Exercises)
  • (6)添加vue-cookie
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (十一)图像的罗伯特梯度锐化
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)N皇后问题
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET NPOI导出Excel详解
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET4.0并行计算技术基础(1)