草稿
最近学习图形学,需要配置 C++ 环境,平时 Xcode 用习惯了,造的这个轮子又没什么第三方依赖,所以出于迅速上手跑代码的目的,直接用 Xcode 写 C++ 了。
〇、准备工作
1.C++ 环境配置
本教程零依赖,而且本质上是个出于教学目的的课程,所以个人认为怎么简单怎么来。因为我平常用 XCode 比较多,就直接在 XCode 里新建了一个 C++ 项目工程,如果平常用 Win 开发也可以用 VS,喜欢折腾的 or C++ 大佬可以自己用 CMake + VSCode 搭建环境
课程的第一课时需要倒入当前目录下的 obj 文件,这时候需要配置相对路径,先做个简单的笔记,后面再整理。
Product -> Scheme -> Edit Scheme
Run -> Options -> Working Directory
勾选 Using custom working directory
,然后点击红圈里的文件夹图标,选择项目文件就可
🔗 参考连接:Xcode 读取代码所在目录txt或文件
2.C++ 基础
众所周知,没有十年经验是无法精通 C++ 的,这个语言里面揉了太多东西了,那么问题来了,对于这个课程,C++ 知识掌握到多少就能跑下来了?
根据我的学习体验,只要你直到啥是类型,if else 和 for 循环知道怎么写,就可以看懂大部分代码了。因为会从 0 实现一个简单的矩阵库,会涉及到运算符重载和模版函数的一些知识,模版函数这里只涉及到泛型编程,不涉及到模版元编程那种高阶知识;会从 0 实现一个 obj 文件的解析库,所以会涉及到一些 IO Stream 的操作。
3.图形学基础
这个课程的教学目的是从 0 实现一个 OpenGL,从而更好的理解 OpenGL 渲染管线,所以本课程是默认学习者有图形学基础的!图形学基础这里视频课程推荐 GAMES101,中文课程 + 英文 PPT,个人认为是最好的图形学入门教材了;纸书有 Real Time Rendering 4 和虎书,都是非常好的教材,但是都是英文版的,不过图形学的教材基本上都是英文的,所以骚年你如果要学图形学,不要怕英文继续冲啊!
4.数学基础
图形学需要大量的数学知识,在前期的学习中主要是线性代数这道坎。这里推荐 Shader 入门精要,还有游戏开发中的数学,3B1E 的视频也不错,后面有空我给大家推荐一下线性代数教材鉴赏。
一.画线
图形的渲染,都是从点线面开始的,点的绘制最简单了,只要有固定的坐标轴和一个确定的坐标点,就可以画一个点。
画线相对来说会麻烦一些,对于一张白纸来说,只要有两个点,铅笔直尺一划,就可以确定一条连续光滑的直线;对于屏幕来说,图像都是一个一个的坐标点,也就是说,直线本质上其实是由离散的点组成的,所以我们要用一个高效的算法来计算。
二.三角形栅格化
1.利用画线的方案画三角形
2.利用三角形的重心坐标绘图
非常重要,后续的插值都是基于三角形的重心坐标这个数学原理的
三.Z-Buffer
利用 Z-Buffer 隐藏不需要渲染的像素,这里要注意和画家算法的区别
四.投影矩阵
投影矩阵的推导和运用
五.MVP 变换
主要是各种坐标系的变换
六.Shaders
从 Lesson06 开始,这个软渲染器就有了一点儿 OpenGL 的影子了。经过代码的重构,在原有代码上抽象出渲染管线的两个核心可编辑单元:顶点着色器和片元着色器。
// 图片
1.Gouraud Shading
顶点着色器和片元着色器抽象出来后,先运用了 Gouraud Shading 对模型做了个简单的插值。Gouraud Shading 是图形学里非常经典的一种着色方法,原理很简单,先计算多边形(一般是三角形)每个顶点的光照,然后利用插值计算出三角形内每个像素的光照信息。
Gouraud Shading 的结果如下:
// 图片
2.自定义 Pixel shaders
经过上一节的练手后,我们可以尝试做一些自定义的 shaders 效果练习。这里做了个非常简单的自定义:只允许 6 个颜色的着色器渲染,效果如下:
// 图片
3.Texture Mapping
Texture Mapping,即材质/纹理贴图,主要是给模型田间细节的,其实前面的课程已经用到了,这里只是把原来的代码写到两个着色器里。
// 图片
4.Normal Mapping(object space)
Normal Mapping,即法线贴图。法线贴图主要是给低面模型增加细节用的,根据坐标系的不同分为 RGB 贴图和切线空间贴图。这一小节主要说一下
5.Normal Mapping(tangent space)
这一章节为原教程第六节的补充内容,因为 tangent space 属于 Normal Mapping 的一个分支,为了思考的连贯性我放在 object space normal mapping 的下面。
Normal Mapping,即法线贴图。切线空间贴图的特点非常明显,贴图整体为蓝紫色色调,理解起来比 RGB 贴图困难一些,但是工程上更为常用。
6.Specular Mapping
Specular Mapping 算是为 Phong Model 补上了最后一块儿砖。我们可以用贴图来指定高光的位置。
七.阴影
渲染两次,渲染出一个硬阴影
八、环境光
本质上是用多个点光源模拟环境光照