Hello OpenGL! 用GLAD+SDL2创建窗口以及初始化OpenGL

用GLAD+SDL2创建窗口以及初始化OpenGL

  • 用到的库下载地址
  • 创建窗口
    • 初始化SDL2
    • 初始化OpenGL
  • 完整代码
  • 参考文献

网上查了一圈才收集到了用SDL2创建OpenGL窗口的办法。简单地总结一下。

用到的库下载地址

  • SDL2
  • GLAD(这个是配好了要用的函数之后自动生成)
  • glm 线性代数数学库(虽然没用到但还是写上了)

先导入SDL21。我用的CMake+vcpkg2,自动化完成- -+

创建窗口

初始化SDL2

SDL2会自动替换带args的main函数,遂直接写main函数:

#include 
#include  //这里会因为导入库的方式不同而不同

// 这里用一个变量来控制主循环
bool m_running = true;

int main(int argc, char** argv) {
	// 初始化video子系统
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		std::cerr << "SDL INIT FAILED." << std::endl;
		return -1;
	}
	
	// 调用这个创建一个窗口,返回SDL_Window指针
	// 函数定义:SDL_CreateWindow(const char* title, int x, int y, int width, int height, Uint32 flags);
	auto* window = SDL_CreateWindow("Hello GL", 
									SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
									800, 600, 
									SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
	
	// 用来接收事件的结构体
	SDL_Event e;
	while (m_running) {
		
		// 事件处理
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) {
				m_running = false;
			}
		}
	}
	
	SDL_DestroyWindow(window);
	return 0;
}

代码很清晰,相信各位一眼就能看懂。

初始化OpenGL

先把下好的GLAD装载器解压,然后原封不动放到项目里去。(用*Make的别忘了加glad.c)
接着在主文件里包含这个目录:

// 一定要注意顺序!!
#include 
#include 

GLAD装载的原理是找OpenGL的函数指针,但是GLAD没有像glew那样自带装载器。于是我们初始化时需要把SDL2提供的装载函数的指针传过去。

SDL2要用OpenGL API绘图(似乎)需要创建一个GL上下文。因此,一并创建了:

	// 上面是初始化window
	auto context = SDL_GL_CreateContext(window);
	gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);
	
	SDL_Event e;
	while (m_running) {
		
		// 事件处理
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) {
				m_running = false;
			}
		}
		// 交换帧(?)缓冲区 (关于这是啥见Vulkan tutorial)
		SDL_GL_SwapWindow(window);
	}
	
	SDL_GL_DeleteContext(context);

于是一篇水文就完成了就能快乐地写代码了

完整代码

最后加上两句gl的清屏命令,完结撒花~

#include 
// 一定要注意顺序!!
#include 
#include  //这里会因为导入库的方式不同而不同

// 这里用一个变量来控制主循环
bool m_running = true;

int main(int argc, char** argv) {
	// 初始化video子系统
	if (SDL_Init(SDL_INIT_VIDEO) < 0) {
		std::cerr << "SDL INIT FAILED." << std::endl;
		return -1;
	}
	
	// 调用这个创建一个窗口,返回SDL_Window指针
	// 函数定义:SDL_CreateWindow(const char* title, int x, int y, int width, int height, Uint32 flags);
	auto* window = SDL_CreateWindow("Hello GL", 
									SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 
									800, 600, 
									SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
	
	auto context = SDL_GL_CreateContext(window);
	gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress);
	
	// 用来接收事件的结构体
	SDL_Event e;
	while (m_running) {
		// 在这里绘图
		// 也有人把绘图放在处理事件后面,我还没弄清楚有啥区别
		glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		// 事件处理
		while (SDL_PollEvent(&e)) {
			if (e.type == SDL_QUIT) {
				m_running = false;
			}
		}
		// 交换帧(?)缓冲区 (关于这是啥见Vulkan tutorial)
		SDL_GL_SwapWindow(window);
	}
	
	SDL_GL_DeleteContext(context);
	SDL_DestroyWindow(window);
	return 0;
}

参考文献

  1. LearnOpenGL-CN 创建窗口
  2. Vulkan Tutorial
  3. SDL2 Wiki

  1. 随便找了个: SDL2学习笔记1-环境搭建以及Hello SDL ↩︎

  2. vcpkg的github仓库 ↩︎

你可能感兴趣的:(OpenGL)