游戏引擎可以理解成一个功能异常强大复杂发软渲染器,软渲染器就是指在尽量不依赖第三方库的条件下,利用代码创建窗口,渲染出一个3d空间里的各种物体。
- 读取一种模型文件(如obj)
- 正交透视相机(投影)
- 三角形遍历与属性设置
- 模拟片元着色器(Blinn Phong着色模型)
- 利用重心坐标插值三角形内部属性
- 逐片元操作:设置颜色,深度值
- 读取一种贴图文件(如bmp)
- 纹理映射
- 利用shadow map实现阴影绘制
-
第一次渲染中 以光源位置作为视点,
基于 Z-buffering 算法,将每个像素点的深度值(z-depth)也就是距离光源最近的对象距离记录在 Z-buffer 中,输出到 FBO(Framebuffer Object) 关联的 texture 中,生成 Shadow Map。
-
第二次场景渲染时,以正常摄像机作为视点,
将每个 fragment 到光源的距离和 Shadow Map 中保存的深度值进行比较,如果大于后者则说明被其他物体遮挡处于阴影之中。
渲染管线流程
画三角形算法(包围盒,逐像素判断,重心坐标)
画3D模型
正交矩阵和透视矩阵
纹理映射与透视矫正
光照模型(漫反射和镜面反射)
shadow map阴影算法
- opencv,用于读取图像,设置纹理
- eigen,用于方便处理向量和矩阵的运算
- 借助opencv库读取图像,设置纹理
brew 安装 opencv2: 添加Header search path和Library search path - class Texture
读取纹理贴图数据 - class Loader
加载模型顶点、法线和纹理 - class Rasterizer
. 几何阶段
顶点着色器(mvp变换)
曲面细分着色器
几何着色器
剪裁
屏幕映射 . 光栅化阶段 三角形设置
三角形遍历
片元着色器
逐片元操作 - main函数
. 加载模型
. 定义相机属性
. render loop
. 清空屏幕 : 设置深度缓存以及fragment缓存
. 设置mvp matrix
基础类:
Loader类,用于加载模型
矩阵类,进行矩阵运算
Texture类,读取纹理贴图数据
Triangle类,用于保存三角形属性
Rasterizer类,用于光栅化过程
Camera类,用于设置相机,更改视角
结构体:
Vector 向量,读取模型数据基本类,包含顶点,法线,uv等信息
Mesh,用于曲面细分,保存信息
Transform类,用于平移,旋转,缩放变换
Color类,描述颜色结构
Light类,光
Buffer类,用于创建各种缓冲,ZBuffer等
Shader类,决定模型属性(颜色,贴图,光照,阴影等)
Window类,创建窗口
Renderer类,渲染窗口
- 涉及较多传递值和地址,边界情况考虑