// 引入GLFW和GLAD头文件
#include "glad\glad.h"
#include "glfw3.h"
int main()
{
// 初始化GLFW
glfwInit();
// 定义OPEN的版本为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //主版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //次版本
// 使用核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
}
// 创建一个Window窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_01", NULL, NULL);
if (window==NULL)
{
printf("无法创建 GLFW 窗口 !");
glfwTerminate();//释放
return -1;
}
glfwMakeContextCurrent(window); // 指定窗口的上下文成为调用线程的当前上下文
// 渲染尺寸调整,保证渲染尺寸随着窗口动态变化
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 方法注册关联到Windows上
// 初始化GLAD,使用创建的Window黑板,加载GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("初始化GLAD失败 !");
return -1;
}
// 每次启动Window窗口不固定,设置窗口居中
int* winWidth = new int;
int* winHeight = new int;
glfwGetWindowSize(window, winWidth, winHeight);
GLFWmonitor* monitor = glfwGetPrimaryMonitor();
const GLFWvidmode* mode = glfwGetVideoMode(monitor);
glfwSetWindowPos(window, (mode->width - *winWidth) / 2, (mode->height - *winHeight) / 2);
// 渲染循环
while (!glfwWindowShouldClose(window))
{
// 渲染内容
processinput(window); // 循环监听按键指令
}
// 按下ESC键退出
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(Swap)前缓冲和后缓冲,这样图像就立即呈显出来,之前提到的不真实感就消除了。
OpenGL中就有“擦黑板”的方法。glClear
// 渲染指令,擦除面板颜色并以固定颜色填充
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // 设置清除颜色
glClear(GL_COLOR_BUFFER_BIT); // 把窗口清除为当前颜色
glClearDepth(1.0); // 指定深度缓冲区中每个像素需要的值
glClear(GL_DEPTH_BUFFER_BIT); // 清除深度缓冲区
#include "glad\glad.h"
#include "glfw3.h"
#include
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
int main() {
// 初始化GLFW
glfwInit();
// 定义OPEN的版本为3.3
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // 主版本
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // 次版本
// 使用核心模式
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
// 创建一个Win窗口
GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL_01", NULL, NULL);
if (window == NULL) {
printf("无法创建 GLFW 窗口 !");
glfwTerminate(); // 释放
return -1;
}
glfwMakeContextCurrent(window);
// 每当窗口尺寸发生变化时,重设渲染尺寸
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 加载GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
printf("初始化GLAD失败 !");
return -1;
}
// 渲染循环
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;
}
// 渲染尺寸调整
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
// 按下ESC键退出
void processInput(GLFWwindow *window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}