代码地址:
https://github.com/Li-Kira/CodeLib/tree/main/CG/GAMES101/Homework03-%E7%9D%80%E8%89%B2
如何在vs中包含文件include folder:
配置环境
在开始作业之前,需要配置一下环境。
- 项目->属性->C++->语言->C++语言标准 选择
ISO C++17标准
- 修改模型文件路径
在main.cpp
中,将路径修改为我们存储模型的路径
1 | std::string filename = "output.png"; |
- 更改着色器
在main.cpp
中,由于默认着色器是phong_fragment_shader
,如果没有实现,想要观察normal shader的效果,可以将其中的参数求改为normal_fragment_shader
。
1 | std::function<Eigen::Vector3f(fragment_shader_payload)> active_shader = normal_fragment_shader; |
作业文档有提示可以使用
./Rasterizer output.png normal
,用输入参数的方式更改着色器,使用visual studio想要用参数调试可以使用以下方法:项目->属性->调试中的
命令参数
可以填入我们运行时需要的参数。
目标
- 在光栅化三角形的函数中实现插值算法
- 添加投影矩阵
- 在
Phong Shader
中实现Blinn-Phong光照模型 - 在
Bump Shader
中实现凹凸映射 - 在
Displacement Shader
中实现位移纹理 - (附加题)尝试更多模型
- (附加题)使用双线性插值进行纹理采样:在 Texture 类中实现一个新方法
getColorBilinear
实现插值算法
以下是完整代码:
1 | //Screen space rasterization |
Blinn-Phong
1 | Eigen::Vector3f phong_fragment_shader(const fragment_shader_payload& payload) |
需要注意的是,ambient只需要计算一次。
Texture mapping
在编写纹理映射的Shader之前,需要考虑纹理的越界问题,以下是对Texture.hpp
的修改。
1 | Eigen::Vector3f getColor(float u, float v) |
大致的代码跟phong shader
的差不多,多了从纹理中获取颜色的过程,即以下的代码。
1 | Eigen::Vector3f return_color = {0, 0, 0}; |
完整代码如下:
1 | Eigen::Vector3f texture_fragment_shader(const fragment_shader_payload& payload) |
Bump mapping
凹凸纹理需要对发现normal进行的数值进行更改,读取凹凸纹理内的uv值。
关于TBN的计算详解在之后的路径追踪,目前根据注释写就可以了。
u和v是纹理坐标的x和y,w和h是纹理的宽度和高度。
1 | float x = normal.x(); |
Displacement mapping
位移纹理需要在凹凸纹理的基础上对point进行更改。
1 | ... |
附加题 - 双线性插值
1 | Eigen::Vector3f getColorBilinear(float u, float v) |