一.写在前面
在学习图形学的过程中,在知乎上看到了几个前辈实现的渲染器,在参照《3D游戏编程大师技巧》以及几位前辈的代码下,用c#实现了一个版本的软件渲染器.
实现代码量并不大,但事实上"不要被这微小的代码量所迷惑,量少就意味每一行代码每一个函数都潜藏着巨大的知识量",本博客意在梳理实现过程中所涉及到的知识点.
若只对前辈们的实现感兴趣,我在本文的最后放了其它实现的github链接.
二.涉及内容
1.渲染管线
程序采用的管线,剪枝裁剪,对屏幕外顶点进行了剪枝,也可以做多边形裁剪.
2.数学运算
①向量点积与叉乘的算法与意义
②齐次坐标
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”—— F.S. Hill, JR
③矩阵乘法
3. 3D变换
①透视变换步骤
②坐标系转换
②相机坐标到屏幕坐标转换
4.纹理双线性过滤采样
①目的
减少因映射造成的纹理信息丢失,减少颗粒感.
②方法
对uv值所对应的纹理坐标分别向上向下取整,取得四个像素点的采样,分别取样对取样结果根据原始坐标所占比例进行插值.
③代价
取样变慢.
④参考
Direct3D 图形学习指南:双线性纹理筛选
5.纹理透视偏差校正
①参考
②注意
透视映射uv时,因为屏幕坐标x,y的变化是与1/z 成线性变化的,所以在计算扫描线前,划分三角形时,插值计算就要对uv/z进行插值,而不是uv.
6.光照
简单的方向光Lambert;
7.裁剪
①背面剔除
根据三角形法向量与相机eye方向的夹角,小于90度的裁掉.
②深度裁剪
③多边形裁剪
根据转换后三角形在屏幕上的坐标进行裁剪.屏幕外的直接剔除
三.效果图
1.纹理透视映射
2.顶点色
3.顶点光照
四.源码
五.参考