在查尔姆斯大学课程
TDA572 游戏引擎架构的项目:
基于自研引擎的沙盘游戏
这是在查尔姆斯理工大学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 组件(控制物体渲染过程) |
元胞自动机(主要由其他组员完成) | 基于元胞自动机的世界元素更新,用来模拟水、火、沙等物理交互 |
碰撞检测(主要由其他组员完成) | 基于像素的碰撞检测 |
1. 从屏幕获取获取ColorBuffer
2. 以灯光像素尺寸为半径创建LightRT
3. 将屏幕中灯光附近的像素Blit到LightRT上,超出屏幕的像素保持空白
4. 创建ShadowMap(RT)用于接受每个角度的最小距离 我设置的宽度为360,每1°发射一条光线,高度为1
5. 创建全屏面片,渲染到ShadowMap。 ShadowMap的 每个片元RayMarching得到该方向上距离光源最近的距离
6. 获得的阴影图记录了周围物体的最近距离
7. Blit一遍屏幕大小的RT,比较每个片元到光源的距离和 ShadowMap 记录的值,来判断是否写入灯光颜色
8. 将灯光渲染到屏幕