NTFT:项目的回购
动机:
啊! -怀旧-,那个小怪物在你的头上爬行……。 我想在90年代回到那里多少,在Quick Basic 4.5编辑器中键入几行,以找出在尝试创建平铺基本RPG时,RAM是一个数字,因为如果可能的话,由于内存的固有限制。
当时我住在哥伦比亚,拥有4色CGA视频卡是完全正常的。 但是,我父亲带了一台新的VGA视频卡计算机,该计算机具有256种8位颜色!现在是时候播放所谓的共享软件演示了(当时非常流行的一种商业模型,每个人都有一个带有酷游戏)。
这些公司也遵循这种模式: Apogee和Id (后来的人也是前者的一部分)。 他们撤出了基恩指挥官,危险戴夫,德军总部3D和毁灭战士。
Doom和W3D是独特的软件,是第一,真实,真实,第一人称射击游戏 。 很多时候,我发现自己想弄清楚当时他们的创作者在想什么。 我认为正是在这里,现在是开始编码进行查找的好时机。
出于好奇,我想了解一下其他人的想法:在那些3D时代,PC图形不是标准化的东西,而今天与opengl,vulkan,directx,metal等无关,实际上任何3D游戏尝试都是大量非标准的数学编程任务。 不仅如此,PC还被认为是计算机图形领域的二等公民,因为控制台使用其图形专用硬件艰难地打了个比方,例如Nintendo Entertainment System平台(又名NES)拥有自己的滚动专用硬件。
在PC和PC游戏设计师面临不利局面的情况下,正是约翰·卡马克(John Carmack)和约翰·罗梅罗(John Romero)(id)背叛了这个行业,并冒着很多胆量,冲进程序,这是有史以来最重要的两个游戏,《德军总部》 3D和DOOM。
这两款游戏在销售和忠实粉丝中都轰动了游戏行业:有一些书(我读过)解释了运行这些游戏的游戏引擎的编程方式。 但是,对我来说一直是个谜:在时间上如此接近的这两个游戏(一个接一个,W3D之后一个是毁灭战士),在图形技术上有如此大的差异?
是的,W3D是光线投射器,而DOOM是光栅化器。 这些技术是并行的,可与特斯拉的交流电和爱迪生的直流电媲美。 当AC赢得那场历史大战时,Rasterizing严重踢了Raycasting的屁股。 为什么这些家伙最初没有拉栅格化,为什么他们认为Raycastig有机会? 我的方法是使用光线投射为自己编写Wolfenstein 3D克隆,使用光栅化为Doom编写代码:每次尝试,我都会抽出100天的代码挑战,并在此处撰写一系列博客。 我不知道这种方法是否可以帮助我回答这些问题,但是我肯定会从中获得一些乐趣。
第1天,GIT项目设置,QT下载和开始,开始黑客大战:
- 假设我在以下链接中设置了一个git项目:Wolf(用于Raycaster Wolfenstein 3D克隆)。 作为初始配方,我将使用Qt的openglwindow示例。
- 下载并安装Qt(将用作OpenGl上下文框架)。
- 创建了一个我链接此页面的自述文件。
就是这样。 但是,任何读者都会想到:“但朱利安,为什么要在光线投射应用程序中使用OpenGl?您不知道OpenGl是光栅化器吗?”。 没错,但是我在这里要做的是对矩形平面进行投影/栅格化并在其周围包裹纹理。 我的光线投射计算会影响包裹的纹理,因此基本上可以说,OpenGl栅格化后将包含一个矩形纹理,并带有光线投射的Wolfenstein 3D水平的投影。
这是我最后一天的结束。 最高提交是这个。 欢迎来到我的旅程。
第2天:让我们看一下里程碑,然后从这里继续前进。
到目前为止,显示的内容是:

这是一个彩色的矩形。 它类似于代码的重要部分。 检查main.cpp文件,尤其是TriangleWindow :: render函数:

签出Day2的提交。
因此,这将是我们真正的凝视点。 原因如下:
- 到目前为止,我们已经栅格化了一个矩形。 Wolfenstein 3D是射线发生器,而不是光栅器。 那么,为什么我们使用opengl(光栅化器)而不是其他任何东西呢? 那么将不会使用太多……只是渲染该矩形。 我们将实施光线投射算法(此后为100天的系列)。 假设在输入什么是光线投射算法的细节之前,先说它需要绘制到目前为止的矩形,并且这种绘制将类似于实际的游戏场景。
- 因此,我们的下一个里程碑将是在矩形上绘制: 包裹的纹理。 (前十天)
- 一旦我们能够在矩形上绘制包裹的纹理,就将逐像素处理该纹理。 这种操纵将使我们能够实现raycaster算法。
- 我不想再制定计划了,因为开发人员我们很喜欢ETA和项目计划,因此请随便命名。
感谢您的光临! 我已经完成了100天代码的第二天!
第三天 :打扫房子一点点。
到目前为止,我的代码已经开始更改。 首先,我们可以看一下着色器:
因此,此代码是开始的顶点着色器和片段着色器。 对其进行解释将没有太大用处。 事实是,这些着色器在main.cpp中作为char字符串存在……太可怕了,而且不那么可读。
因此,今天我们将设置两个文件,每个着色器分别指定wolfey.vert和wolfey.frag。另外,我们还将使用共享指针将这些文件加载到RAM中。 就像着色器一样,我们还没有到那里来解释什么是智能指针,它在项目的这一部分中很有用,尽管如此,当代码更加井井有条,可读性更好时,我将说明什么是着色器,哪些是智能的指针。
因此,我们需要修改.pro和qmake代码,以告诉编译器资源文件夹在哪个路径中:
因此,此代码在pathtoyourwolf3dproject / resources目录(第12行)中设置了resources文件夹。 并为c预处理器创建一个名为RESOURCES_DIR的宏定义。
好吧,让我们检查一下它的资源文件夹在内部的组织方式:
资源/
├──着色器
│├──wolfy.frag
│└──wolfy.vert
└──质地
├──evillogo.png
└──Intro.png
在那里,资源/着色器现在是我们的着色器所在的文件夹。 他们从代码中消失了。 请记住,您可以在当天的提交中检查所有这些更改。3.立即检查main.cpp文件,尤其是TriangleWindow :: initialize方法,因为这是此提交中更改最多的函数:
转到第65行并回溯vertexShaderSource(当然是指向从wolfey.vert加载的vertexShader指令的指针)变量以了解其加载方式。
好吧,这是我的第三个代码日。 没有太大的变化,但是在组织方面,这将是一个巨大的胜利,您会在未来的日子里注意到这一点。 我想我将摘要分成5天而不是10天,原因是日复一日地创建了许多材料。
非常感谢。 明天我们将尝试对着色器做一些更有趣的事情,我们将尝试在矩形周围包裹纹理。
感谢您加入我!
第4天 :我只是更改了着色器上的某些内容。
好吧,今天的进步是一个骗局!!! 我只是更改了着色器的格式,然后将它们重写为新的着色器。 这与传奇的learningopengl.com OpenGL教程一起具有等效的格式。
因此,通过这样做,最终我希望在正方形周围包裹一些纹理。
感谢加入我!
第5天 :我的歉意,工作和家庭之间没有太多时间!
昨天我执行了我一小时的代码,但是没有推送它们,也没有在Twitter中报告进度。 抱歉! 但是,这里是代码提交!。
这是代码:
因此,此代码在ram中加载了Dummy.png文件。 该文件包含虚拟纹理。 纹理只是一个紫红色的矩形,仅用于测试纹理加载过程。