【OPENGL学习】glfw+glad的环境搭建和第一个窗口程序

提示:以下是本篇文章正文内容,下面案例可供参考

一、opengl是什么?

 OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库

二、使用步骤

1.引入库

全程是按照网站:https://learnopengl-cn.github.io/来学习的嘻嘻,感谢大佬的分享。网站目前推荐使用glfw和glad(目前是,以后可能会更新)。

第一步肯定是具备一个vs2019呀。

第二步是下载glfw和glad。
1.首先glfw的下载地址:http://www.glfw.org/download.html
下载红框里面的东西
下载红框里面的东西
然后把解压包的incluse文件夹和lib-vc2019分别解压出来,我这边就解压到这里。

2.下载glad,下载地址:https://glad.dav1d.de/
因为glfw不支持opengl3.0以前的版本,所以我这里下载了4.6版本。
把glad.zip里面的include文件解压到glfw的incluse文件夹和lib-vc2019同一目录下。
选好版本,点击generate

3.用vs2019创建一个c++工程,然后右击工程选择属性,在vc++里找到包含目录和库目录,把解压出来的文件路径 输入进去如图

5.还有就是等在连接器里面添加 glfw3.lib还有就是等在连接器里面添加 glfw3.lib

6.最后把glad.zip里的glad.c文件放到工程里面。如图,不然编译器就会说glad的函数无法进行外部链接

7.好到的环境搭建完毕,下面开工。

2.不说了,直接上代码

代码如下(示例):


#include<glad/glad.h> //glad的引入必须要在glfw的上面
#include<GLFW/glfw3.h>
#include<iostream>

using namespace std;

//窗口的宽度
static int width = 800;
//窗口高度
static int height = 600;
//窗口的名字
static char  window_name[] = "opengl window";

void framebuffer_size_callback(GLFWwindow*,int,int);
void processInput(GLFWwindow*);
void renderOrder();

int main() {
    
    
	cout << "opengl progaming start......" << "\n";
	//函数库的初始化
	glfwInit();
	//设定opengl版本为3.3
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	//设定opengl为核心模式
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//苹果的系统下需要进行兼容的设置
#ifdef _apple_
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
	//创建窗口对象
	GLFWwindow* window = glfwCreateWindow(width, height, window_name, NULL, NULL);
	if (window == NULL) {
    
    
		cout << "opengl window start fail!gl progaming will terminate....." << endl;
		glfwTerminate(); //终结掉gl程序
		return -1;
	}
	//设定当前剩下文
	glfwMakeContextCurrent(window);
	//注册窗口大小改变回调
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
	//初始化gladLoader
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
    
    
		//如果无法获取到glfw指针就相当于失败,并且终止掉gl程序
		cout << "can`t get glfw pointer address!gl progaming will terminate....." << endl;
		glfwTerminate();
		return -1;
	}
	//执行到这里就是默认完成了所有初始化
   //glfw没有执行结束的时候就一直是死循环
	while (!glfwWindowShouldClose(window))
	{
    
    
		processInput(window);
		renderOrder();
		//缓冲区交互
		//关于双缓存的补充:
		//如果使用单缓存的渲染模式,那么游戏画面可以会出现闪烁现象,原因是图形渲染出一帧的画面时,每一个像素点不是同时渲染出来的,
		//而是遵循流水线,由左往右,由上往下来进行渲染的。所以这个时候采用双缓存,当前缓存显示完,直接把后缓存的画面交换上去,则就可以避免游戏闪烁现象。
		//并且使用glfeSwapBuffers()函数进行交换。
		glfwSwapBuffers(window);
		//执行被触发的事件
		glfwPollEvents();
	}
	return 0;
}

/// <summary>
/// 回调函数。窗口大小改变时。
/// </summary>
void framebuffer_size_callback(GLFWwindow* window, int wid, int het) {
    
    
   //这是控制视口的函数。
   //前面两个参数是指视口的左下角的坐标偏移位置。(opengl的视口窗口默认左下角为原点0,0)
   //后面两个参数是指视口的宽度和高度
	glViewport(0, 0, wid, het);
	cout << "opengl window resolution change!" << "wid:" << wid << "  " << "het:" << het << endl;
}
/// <summary>
/// 输入函数
/// </summary>
void processInput(GLFWwindow* window){
    
    
	if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){
    
    
		glfwSetWindowShouldClose(window,true);
	}
}
/// <summary>
/// 渲染指令
/// </summary>
void renderOrder() {
    
    
	//深绿色
	glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
	//关于glfwClear函数,这是一个清屏的函数。当前是去掉颜色缓存区
   //如果传入参数GL_DETCH_BUFFER_BIT(深度缓存区)和GL_STENCIL_BUFFER_BIT(模板缓存区)就是清掉对应的缓存区
	glClear(GL_COLOR_BUFFER_BIT);
}

总结

主要是搭建好环境和写了一下opengl的窗口程序。
关于选择版本方面:早期的opengl都是使用立即模式(固定渲染管线)进行渲染的。从opengl 3.2版本开始,opengl费除掉了立即模式,而改用了核心模式,并且鼓励开发者使用这个模式。大部分开发者都是选用早期的opengl版本,因为新的opengl版本基本都是在原有的基础上添加新特性,或者对同一个功能采用更好的方式实现(优化)。而新的特性很有可能需要新版本的显卡驱动提供的,为了更好兼容版本而选用早期版本的opengl。

扫描二维码关注公众号,回复: 14884333 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_41094072/article/details/124932419