用C++实现的初级光栅器
在学习GAMES101后,跟着完成一个Github上的一个tinyRenderer的项目。这篇随笔简要的介绍了都有什么知识点,没有具体的数学实现,只是我在复习时的脉络梳理。作为我的第一篇博客,写的不好请原谅,并希望您加以给予一些修改意见,我会认真倾听并思考,感谢。
在Visual Studio 创建项目
Bresenham算法
A,B两点
连接A,B
Bounding Box包围盒
取最小,最大的x,y轴坐标进行包围盒
三角形三个点A,B,C
Cross(PA,PB)<0 || Cross(PB,PC)<0 || Cross(PC,PA)<0 则在三角形外
重心坐标
矩阵算
Z-Buffer深度缓冲
将每个三角形进行遍历,在每个包围盒中更新z-buffer的深度值,更新为更小深度的值
仿射变换
- 线性变换
- 旋转
- 放缩
- 错切
- 平移
视图变换+透视变换+视口变换
矩阵算
Phong反射模型
环境光+漫反射+镜面反射
平滑着色, 法线贴图,漫反射贴图,镜面反射贴图
取三角形的三个顶点,根据α,β,γ占比分别乘x,
- x=法线,实现平滑着色
- x=uv坐标
- 实现纹理--法线贴图 _ _nm
- 实现颜色--漫反射贴图 _ _diffuse
- 实现高光--镜面反射贴图 _ _spec
切线空间法线贴图
法线贴图->切线空间法线贴图 _ _ nm_tangent
法线贴图,模型不能进行旋转等操作
切线空间法线贴图可以
将法线贴图的法线(世界空间) 转换成 切线空间法线贴图的法线(局部(切线)空间)
阴影贴图
- 在光源处生成阴影贴图
- 应用阴影
- 计算该像素在光源视角下的位置
- 采样阴影贴图中的深度
- 比较:当前深度 > 贴图深度?→ 在阴影中
- 应用阴影效果(变暗)
Sobel边缘检测
卷积,大于敏感度阈值,被认为是边界,涂黑
AO环境光遮蔽
在模型周围一个球内取随机位置,定为光源位置
在这些位置这些位置的阴影贴图,取平均阴影
SSAO屏幕空间环境光遮蔽
先光栅化一遍
再遍历一遍每个像素,在每个像素目前对应的坐标周围进行采样,通过采样点的深度与采样点投影到平面后的像素的深度进行比较。若投影到屏幕的采样点的深度 < 采样点的深度,则被遮挡,被遮挡数多,则变暗
生成白模