【OpenGL 学习笔记】第 2 篇:绘制一个窗口

这篇博客介绍了如何使用GLFW库初始化OpenGL上下文并创建窗口,包括GLFW的初始化、版本信息获取、窗口创建等步骤。同时,讲解了GLAD库的使用,用于加载OpenGL函数指针,并设置了视口、渲染循环以及资源释放。在实验源码中,展示了如何显示窗口和修改背景色,最后给出了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

        一、实例化GLFW窗口

        1、GLFW初始化

        2、查看GLFW版本信息

        3、创建窗口对象 

二、GLAD

        1、初始化GLAD

        2、视口

        3、渲染 

        4、释放资源

        三、实验源码

        1、显示窗口

        2、修改背景色


一、实例化GLFW窗口

1、GLFW初始化

#include <glad/glad.h> 
#include <GLFW/glfw3.h>

#include <iostream>

int main() {

	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码

	return 0;
}

上面的代码如果发生如下报错,请查看解决办法链接:(3条消息) 解决错误: LNK2019 无法解析的外部符号_代码骑士的博客-CSDN博客

 2、查看GLFW版本信息

void getVersion() {
	int Major, Minor, Rev;
	glfwGetVersion(&Major, &Minor, &Rev);
	printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
}

调用这个函数输出版本信息

3、创建窗口对象 

void createWindow() {
	GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
	if (window == NULL) {//创建失败
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return;
	}
	glfwMakeContextCurrent(window);
}

二、GLAD

1、初始化GLAD

glad是用来管理OpenGL的函数指针的,所以在调用任何OpenGL的函数之前我们都需要初始化GLAD

	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

2、视口

在开始渲染之前,我们要先设置OpenGL渲染窗口的尺寸大小,即视口(ViewPort)。目的是使OpenGL知道窗口的大小和坐标。我们可以通过调用glViewport函数设置窗口维度(Dimension):

glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)

注意:

回调函数:

void framebuffer_size_callback(GLFWwindow* window, int width, int height);

 

void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

 

glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

 

3、渲染 

为了使我们的窗口能够持续渲染并且可以接收到用户输入,我们要在程序中添加一段while循环,也可称之为渲染循环(Render Loop),它能够在我们让GLF退出前一直保持运行。

while (!glfwWindowShouldClose(window))
	{
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

函数说明:

 

4、释放资源

 

glfwTerminate();

三、实验源码

1、显示窗口

#include <glad/glad.h> 
#include <GLFW/glfw3.h>

#include <iostream>
#include<conio.h>

void getVersion() {
	int Major, Minor, Rev;
	glfwGetVersion(&Major, &Minor, &Rev);
	printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
}

GLFWwindow* createWindow() {
	GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
	if (window == NULL) {//创建失败
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return window;
	}
	glfwMakeContextCurrent(window);
	//_getch();
	return window;
}

//回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

int main() {

	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码
	
	getVersion();
	
	//createWindow();
	
	GLFWwindow* window = createWindow();

	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	//glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)
	framebuffer_size_callback(window, 800, 600);
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	while (!glfwWindowShouldClose(window))
	{
		glfwSwapBuffers(window);
		glfwPollEvents();
	}
	glfwTerminate();
	return 0;
}

 输出结果:

2、修改背景色

渲染指令代码结构:

//渲染循环
	while (!glfwWindowShouldClose(window))
	{
		//输入
		processInput(window);

		//渲染指令
		//……

		//检测并调用事件,交换缓冲
		glfwPollEvents();
		glfwSwapBuffers(window);
	}

#include <glad/glad.h> 
#include <GLFW/glfw3.h>

#include <iostream>
#include<conio.h>

void getVersion() {
	int Major, Minor, Rev;
	glfwGetVersion(&Major, &Minor, &Rev);
	printf("GLFW %d.%d.%d initialized\n", Major, Minor, Rev);
}

GLFWwindow* createWindow() {
	GLFWwindow* window = glfwCreateWindow(800, 600, "window", NULL, NULL);//参数:宽,高,名称
	if (window == NULL) {//创建失败
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return window;
	}
	glfwMakeContextCurrent(window);
	//_getch();
	return window;
}

//回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
	glViewport(0, 0, width, height);
}

int main() {

	glfwInit();//初始化GLFW
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//设置主版本号
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//设置次版本号
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//设置核心模式
	//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);//使用MAC系统的加上这句代码
	
	getVersion();
	
	//createWindow();
	
	GLFWwindow* window = createWindow();

	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	//glViewport(0, 0, 800, 600);//参数:前两个是窗口左下角坐标,后两个是渲染窗口的宽和高(像素)
	framebuffer_size_callback(window, 800, 600);
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

	//渲染循环
	while (!glfwWindowShouldClose(window))
	{
		//输入
		//processInput(window);
		//渲染指令
		glClearColor(0.0f, 0.34f, 0.57f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		//检测并调用事件,交换缓冲
		glfwPollEvents();
		glfwSwapBuffers(window);
	}
	glfwTerminate();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码骑士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值