Window环境初始化OpenGL渲染窗口

【第一步】初始化GLFW和版本指定。

// 引入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渲染窗口。

// 创建一个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循环。

// 渲染循环
while (!glfwWindowShouldClose(window))
{
    // 渲染内容
    processinput(window); // 循环监听按键指令
}

【第四步】接受键盘指令和缓冲交换

// 按下ESC键退出
void processInput(GLFWwindow *window)
{
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
}

双缓冲(Double Buffer)

应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们交换(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);          // 清除深度缓冲区

完整的C++代码

#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);
}

 

你可能感兴趣的:(Window环境初始化OpenGL渲染窗口)