从零开始手敲次世代游戏引擎(三十二)

差不多是时候将我们前面所写的场景管理模块与图形渲染模块结合起来了。
首先我们使用DDC工具创建并导出一个场景。这里我们以开源(免费)的Blender作为演示。Blender的下载地址在参考引用*1当中。
另外因为目前我们只实现了OpenGEX的导入,我们需要下载一个Blender用的OpenGEX导出脚本(插件)。下载地址在参考引用*2当中。
简便起见我们就导出Blender的缺省场景,具体步骤参考下面的录屏:
 
 

视频封面

上传视频封面

 
 
 
 
 
 
 
 
接下来我们需要修改RHI/OpenGL/OpenGLGraphicsManager.cpp,主要需要修改InitializeBuffers,将原来Hard coding在其中的顶点数据去除,改为从Framework/Common/SceneManager当中动态获取。
修改Test/SceneLoaderTest.cpp,将其中读取的文件从“Example.ogex”改为我们刚刚导出的“cube.ogex”,编译执行,观察格式能够被识别并且能够正确导入。
导入的顶点数据包括两个属性:position和normal。也就是说有顶点的坐标,还有顶点处的法线,但是没有顶点色。我们之前写的color.vs和color.ps是需要顶点坐标和顶点色,这里需要改一下。将Asset/Shader下面的color.vs和color.ps各自复制一份,重新命名为basic.vs和basic.ps,并且将其中的顶点色部分替换为顶点法线,或者去除。
简单起见我们还未考虑光源。本来在PS Shader(fragment shader)当中应该根据法线和光源的夹角进行光照计算的,现在我们暂时固定输出白色。
修改Framework/Common/main.cpp,让SceneManager加载cube.ogex。编译执行之后的显示如下:
 

视频封面

上传视频封面

 
 
 
 
 
 
 
 
为了确认这个立方体确实是从外部导入的,从Blender场景当中删除立方体,新建一个Monkey,然后重新导出,覆盖cube.ogex。然后重新执行程序,显示如下:
 

视频封面

上传视频封面

 
 
 
 
 
 
 
 
下一步,尝试在Blender当中加入多个几何体,然后导出,用我们的程序导入并渲染:
 

视频封面

上传视频封面

 
 
 
 
 
 
 
 

视频封面

上传视频封面

 
 
 
 
 
 
 
 
这里我们会发现虽然我们在Blender里面将几何体都在位置上错开了,但是渲染的结果是重叠在一起的。这是因为我们目前只是简单地从SceneManager获取SceneObject(场景物体)进行渲染,而没有根据SceneNode(场景图)进行场景物体的摆放(场景位置计算)。这是我们接下来的工作。
另外,如果仔细观察,会发现我们的几何体边缘有明显的锯齿。这些锯齿是由于采样精度产生的。改善这些锯齿的算法被称为反走样技术(Anti-Aliasing,简称AA)。AA有很多衍生的算法种类,但总的来说大都是在一定范围内采用提高采样精度的方式来解决的。其中比较广泛使用的,效果也比较理想的,并且得到图形硬件支持的技术之一,MSAA,是可以通过在创建图形context(FrameBuffer)的时候指定特定的选项来打开的。
参考引用*3当中详细解释了在Windows/Linux/macOS这三种主流平台用OpenGL打开MSAA的方法。但是macOS当中使用Cocoa的方法尚未记述。通过类比并综合网上其它的信息,最终确认在macOS上使用Cocoa打开MSAA的方法如下:
打开之后的效果如下:
 

视频封面

上传视频封面

最终代码在article_32的分支当中。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

您正在使用您的 WordPress.com 账号评论。 登出 /  更改 )

Google photo

您正在使用您的 Google 账号评论。 登出 /  更改 )

Twitter picture

您正在使用您的 Twitter 账号评论。 登出 /  更改 )

Facebook photo

您正在使用您的 Facebook 账号评论。 登出 /  更改 )

Connecting to %s

%d 博主赞过: