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):用于绘制新的图像内容。
在绘制完成后,将后缓存的内容交换到前缓存,以避免用户看到图像绘制的过程,从而避免闪烁和视觉不连续性。