[从Minecraft学游戏开发]创建窗口


声明:本教程的图像,资源,代码仅供学习参考使用,禁止以任何形式发布。如有违反代码提供者(本人)不付任何责任。
项目开源地址 https://github.com/OrbitGW/MYCRAFT



创建窗口

效果图:


头文件

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>

主体

先初始化GLFW,这是一个框架库,我们会用到它来创建窗口

	glfwInit();

配置GLFW,此项可以没有,为了兼容性我们配置GL版本为3.3 Core模式,如果没有,他会使用支持的最高版本(现在一般为GL4.6) 。

	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); This is for Mac OS X

接下来创建窗口对象,并设置到主线程上下文:

	GLFWwindow* window = glfwCreateWindow(800, 600, "MYCRAFT", NULL, NULL);
	if (window == NULL)
	{
	    std::cerr << "Failed to create window" << std::endl;
	    glfwTerminate();
	    return -1;
	}
	glfwMakeContextCurrent(window);

glfwCreateWindow前两个参数函数是窗口的宽和高。第三个参数表示这个窗口的title。这个函数将会返回一个GLFWwindow对象,我们会在其它的GLFW操作中使用到。创建完窗口我们就可以通知GLFW将我们窗口的上下文设置为当前线程的主上下文了。

GLAD

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

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

视口

在我们开始渲染之前,我们必须告诉GL渲染窗口的尺寸大小,即视口(Viewport),这样GL才只能知道怎样根据窗口大小显示数据和坐标。

	glViewport(0, 0, 800, 600);

改变窗口的大小的时候,视口也应该被调整。我们可以对窗口注册一个回调函数(Callback Function),它会在每次窗口大小被调整的时候被调用。这个回调函数的原型如下:

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

这个帧缓冲大小函数需要一个GLFWwindow作为它的第一个参数,以及两个整数表示窗口的新维度。每当窗口改变大小,GLFW会调用这个函数并填充相应的参数供你处理。

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

我们还需要注册这个函数,告诉GLFW我们希望每当窗口调整大小的时候调用这个函数:

	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);

主循环

	while(!glfwWindowShouldClose(window))
	{
	    glfwSwapBuffers(window);
	    glfwPollEvents(); //Check Events 
	}

最后

	glfwTerminate();
	return 0;	

渲染

我们使用一个自定义的颜色清空屏幕。在每个新的渲染迭代开始的时候我们总是希望清屏,否则我们仍能看见上一次迭代的渲染结果。我们可以通过调用glClear函数来清空屏幕的颜色缓冲,它接受一个缓冲位(Buffer Bit)来指定要清空的缓冲,可能的缓冲位有GL_COLOR_BUFFER_BIT,GL_DEPTH_BUFFER_BIT和GL_STENCIL_BUFFER_BIT。由于现在我们只关心颜色值,所以我们只清空颜色缓冲。

	while(!glfwWindowShouldClose(window))
	{
		glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		
	    glfwSwapBuffers(window);
	    glfwPollEvents();
	}

GL通常使用的颜色值是0.0-1.0的浮点值,而不是通常的0-255所以你如果还是习惯0-255的rgb你可以自己写一个转换函数

输入

我们可以使用GLFW的glfwGetKey函数对其进行交互,它需要一个窗口以及一个按键作为输入。这个函数将会返回这个按键是否正在被按下。我们将创建一个processInput函数来让所有的输入代码保持整洁。

    if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);

这里我们检查用户是否按下了返回键(Esc)(如果没有按下,glfwGetKey将会返回GLFW_RELEASE。如果用户的确按下了返回键,我们将通过glfwSetwindowShouldClose使用把WindowShouldClose属性设置为 true的方法退出主循环。


窗口图标

这里我们需要用到<stb_image.h>的stbi_load函数加载图像,再将数据传给GLFWImage对象,最后使用glfwSetWindowIcon函数设置图标

	GLFWimage icon;
    icon.width = 32;
    icon.height = 32;
    int channels = 3;
    icon.pixels = stbi_load("assets/logo/logo.png", &icon.width, &icon.height, &channels, 4);
    glfwSetWindowIcon(window, 1, &icon);

最后效果如下:
在这里插入图片描述

完整代码

完整代码请参考这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

orbitgw

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

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

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

打赏作者

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

抵扣说明:

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

余额充值