OpenGL自制游戏引擎-GreateWindow

自制游戏引擎,学习OpenGL相关知识并进行实践,学习引擎底层知识,提高对游戏引擎的认识。

基于GLFW、GLEW的环境配置

这次我们使用下面的方式构建OpenGL环境
1.下载GLFW
https://www.glfw.org/download.html
在glfw官网下载32Bit的package

These packages contain the GLFW header files, documentation and release mode static libraries, DLLs and import libraries for Visual C++ 2010-2019, MinGW-w64 and plain MinGW.

2.下载GLEW
http://glew.sourceforge.net/

The OpenGL Extension Wrangler Library (GLEW) is a cross-platform open-source C/C++ extension loading library. GLEW provides efficient run-time mechanisms for determining which OpenGL extensions are supported on the target platform. OpenGL core and extension functionality is exposed in a single header file. GLEW has been tested on a variety of operating systems, including Windows

3.新建一个空的C++工程
添加一个CPP工程

4.相关库的配置
在工程右键选择属性
在C/C++中设置常规添加库文件的头文件


11173460-aa69c869ce07cf44.PNG
附加包目录

在链接器中将上面添加的头文件与工程进行链接


11173460-c45ab19baf3ad4d3.PNG
附加库目录.PNG

在链接器的输入中添加要具体添加的lib


11173460-52f5eb1e7d3717d3.PNG
添加附加依赖项.PNG
开一个视窗

1.初始化glfw

glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//主版本号
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//子版本号
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//OPENGL核心版本,使用可编程流水线
    

2.创建一个窗口,设置window为当前线程的主要上下文

//Open GLFW Window
    GLFWwindow* window = glfwCreateWindow(800, 900, "Frist Window", NULL, NULL);
    if (window == NULL)
    {
        printf("Open Window Failed");
        return -1;
    }
    glfwMakeContextCurrent(window);//将window设置为当前thread的主要上下文

3.初始化glew

glewExperimental = true;
    if (glewInit() != GLEW_OK)
    {
        printf("InitGLEW failed");
        glfwTerminate();
        return -1;
    }

4.设置窗口的Viewport,在RenderRoll循环渲染、等待系统消息

glViewport(0, 0, 800, 600);
    //Ready engines
    while (!glfwWindowShouldClose(window))
    {
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

Double buffer:
当我们只使用一个buffer的时候,pixel的渲染是从左到右从上到下的,会造成闪屏的问题。为了解决这个问题,使用两个Buffer。
frontBuffer:包括最终的显示在屏幕上的输出结果。
backBuffer:全部的渲染指令
当全部渲染指令完成的时候,将backBuffer转换到frontBuffer,图像将直接展现给我们。

5.添加一个退出按键

void  ProcessInput(GLFWwindow* window) {
    if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
    {
        glfwSetWindowShouldClose(window, true);
    }
}

6.清除屏幕颜色缓冲区
在Render循环中添加清空Buffer的操作,否则渲染的buffer会和前一帧重叠

while (!glfwWindowShouldClose(window))
    {
        ProcessInput(window);

        glClearColor(1.0f, 0, 0, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

参考资料:
1.《OpenGL编程指南》
2.https://learnopengl.com/Getting-started/Hello-Window
3.https://www.bilibili.com/video/av24353839

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作者对游戏的说明: 首先,您应当以一种批判的眼光来看待本程序。这个游戏是我制作 的第一部RPG游戏,无任何经验可谈,完全按照自己对游戏的理解进 行设计的。当我参照了《圣剑英雄2》的源码之后,才体会到专业游 戏引擎的博大精深。 该程序的内核大约有2000余行,能够处理人物的行走、对话、战斗, 等等。由于该程序的结构并不适于这种规模的程序,故不推荐您详 细研究该程序。所附地图编辑器的源程序我已经添加了详细的注释, 其程序结构也比较合理,可以作为初学VC的例子。 该程序在VC的程序向导所生成的SDI框架的基础上修改而成。它没有 使用任何关于VC底层的东西。程序的绝大部分都是在CgameView类中 制作的,只有修改窗口特征的一段代码在CMainFrm类中。其他的类 统统没有用到。另外添加的一个类是CEnemy类。 整个游戏的故事情节分成8段,分别由Para1.h ~ Para8.h八个文件 实现。由于程序仅仅能够被动的处理各种各样的消息,所以情节的 实现也只能根据系统的一些参数来判断当前应当做什么。在程序中 使用了冗长的if……else if……结构来实现这种判断。 当然,在我的记录本上,详细的记录了每个事件的判断条件。这种 笨拙的设计当然是不可取的。成都金点所作《圣剑英雄II》采用了 剧本解读的方式,这才是正统的做法。但这也需要更多的编程经验 和熟练的code功夫。 下面列举的是程序编制过程中总结出来的经验和教训。 第一,对话方式应该采用《圣剑英雄II》的剧本方式。 现在的方式把一个段落中所有的对话都混在一个文件中,然后给每 句话一个号码相对应。这样做虽然降低了引擎的难度,却导致剧情的 编写极其繁琐。 第二,运动和显示应当完全分开。 现在的程序中,运动和显示是完全同步的。即:在定时器中调用所有 敌人的运动函数,然后将主角的动画向前推一帧,接着绘制地图,调 用所有敌人的显示函数、重绘主角。这样的好处是不会掉帧,但带来 的问题是,如果要提高敌人的运动速度,那么帧数也跟着上去了。所 以当DEMO版反馈说速度太慢的时候,我修改起来非常困难。而这个问 题到最后也仅仅是将4步一格该成了2步一格。 第三,VC中数组存在上限。如果用“int aaa[1000000000]”定义一个 数组,编译器肯定不会给分配那么大的内存空间。而在这个程序中, 地图矩阵、NPC矩阵都超过了VC中数组的上限。但这一点知道的太晚了。 在1.0版本中已经发现地图最右端缺少了几行,但不知道是什么原因 造成的。(地图编辑器中未出现此问题,因为地图编辑器是用“序列 化”的方式存盘读盘的。)解决这个问题的方法是用“new”来分配 内存空间。 第四,由于不知道应该如何使用“new”和“delete”,几乎所有的DC 都使用了全局变量。这是完全没有必要的。程序运行期大约会耗用20 多M的内存空间,相当于一个大型游戏所使用的内存空间了。 另外,在游戏的剧情、美工方面也有许多问题,总之一个词“业余”。 我就不总结了。下一部作品,我将争取在程序上有一个质的飞跃。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值