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

cpp 复制代码
#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函数可以获取上行代码是否报错以及错误信息:

cpp 复制代码
#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):用于绘制新的图像内容。

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

相关推荐
sulikey37 分钟前
Qt 入门简洁笔记:信号与槽
前端·c++·笔记·qt·前端框架·1024程序员节·qt框架
沐怡旸1 小时前
【穿越Effective C++】条款5:了解C++默默编写并调用哪些函数——编译器自动生成的秘密
c++
小年糕是糕手1 小时前
【数据结构】队列“0”基础知识讲解 + 实战演练
c语言·开发语言·数据结构·c++·学习·算法
Q741_1472 小时前
C++ 分治 快速选择算法 堆排序 TopK问题 力扣 215. 数组中的第K个最大元素 题解 每日一题
c++·算法·leetcode·分治·1024程序员节·topk问题·快速选择算法
敲上瘾2 小时前
背包dp——动态规划
c++·算法·动态规划
水星梦月3 小时前
跨平台开发中的图形渲染:Canvas与View+CSS的性能分析与决策路径
前端·css·图形渲染·canvas
AA陈超9 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-14 属性菜单 - 文本值行
c++·游戏·ue5·游戏引擎·虚幻
云知谷9 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
weixin_5829851810 小时前
OpenCV cv::Mat.type() 以及类型数据转换
c++·opencv·计算机视觉
oioihoii12 小时前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++