Pixel Forge

查尔姆斯大学课程 TDA572 游戏引擎架构的项目:
基于自研引擎的沙盘游戏

Pixel Forge

项目介绍

这是在查尔姆斯理工大学TDA572课程期间完成的项目。该项目主页制作了一个2D游戏引擎,基于C#、Entitas、OpenGL开发,实现了基本的渲染架构,并在2D灯光与元胞自动机两个方面加入了更深入的特性。我在项目中负责:1) 搭建渲染管线;    2) 实现2D灯光和后处理系统;   3) 编写元胞自动机模块 Shader;   4) 调整项目美术效果。

引擎的特性

特性 描述
ECS 引擎中的每个系统都基于 ECS(Entitas 库)
平行渲染 支持将对象渲染到不同的图层,然后将它们合并在一起;渲染流程基于OpenGL和Silk.Net
后处理组件/系统 可扩展的后处理系统(包括Bloom和高斯模糊),允许为不同的图层添加不同的效果
照明组件/系统 基于像素的2D光照,可以为不同图层添加不同的光源
渲染工具 仿照Unity封装的用于渲染的对象,如Renderer, Texture, RenderTexture(带有FBO), Blitter等
其他组件/系统 相机(处理相机参数)、Renderer 组件(控制物体渲染过程)
元胞自动机(主要由其他组员完成) 基于元胞自动机的世界元素更新,用来模拟水、火、沙等物理交互
碰撞检测(主要由其他组员完成) 基于像素的碰撞检测

2D light principle

Pixel Forge - 2D 灯光分支

下面将介绍从 Color Buffer 生成 2D 灯光的过程

1. 从屏幕获取获取ColorBuffer

2. 以灯光像素尺寸为半径创建LightRT

3. 将屏幕中灯光附近的像素Blit到LightRT上,超出屏幕的像素保持空白

4. 创建ShadowMap(RT)用于接受每个角度的最小距离 我设置的宽度为360,每1°发射一条光线,高度为1

5. 创建全屏面片,渲染到ShadowMap。 ShadowMap的 每个片元RayMarching得到该方向上距离光源最近的距离

6. 获得的阴影图记录了周围物体的最近距离

7. Blit一遍屏幕大小的RT,比较每个片元到光源的距离和 ShadowMap 记录的值,来判断是否写入灯光颜色

8. 将灯光渲染到屏幕

其他2D光的特性

使用高斯模糊来实现更柔和的阴影边缘

增加了降采样功能,牺牲lightMap尺寸和质量来换取更高的性能。配合高斯模糊也可以取得不错的效果。.

由于将计算托管到GPU并行处理,即使用了Ray Marching, 整体性能还不错。可以支持屏幕1200*1200,全分辨率LightMap,径向步进200次,圆周步进360次,300盏灯运行60帧(4070ti)。