文章目录
本文为闫令琪老师的GAMES 101课程的作业3的个人实现与一些简单的思考,文中如有错漏欢迎指出。
作业要求
-
修改函数
rasterize_triangle(const Triangle& t)
in rasterizer.cpp:在此处实现与作业2类似的插值算法,实现法向量、颜色、纹理颜色的插值。 -
实现4个shader:
phong_fragment_shader()
,texture_fragment_shader()
,bump_fragment_shader()
,displacement_fragment_shader()
代码实现
rasterize_triangle
对每个属性进行插值,传入fragment_shader
// TODO: Interpolate the attributes:
auto interpolated_color = interpolate(alpha, beta, gamma, t.color[0], t.color[1], t.color[2], 1);
auto interpolated_normal = interpolate(alpha, beta, gamma, t.normal[0], t.normal[1], t.normal[2], 1);
auto interpolated_texcoords = interpolate(alpha, beta, gamma, t.tex_coords[0], t.tex_coords[1], t.tex_coords[2], 1);
// view space pos
auto interpolated_shadingcoords = interpolate(alpha, beta, gamma, view_pos[0], view_pos[1], view_pos[2], 1);
fragment_shader_payload payload( interpolated_color, interpolated_normal.normalized(), interpolated_texcoords, texture ? &*texture : nullptr);
payload.view_pos = interpolated_shadingcoords;
// Instead of passing the triangle's color directly to the frame buffer, pass the color to the shaders first to get the final color;
auto pixel_color = fragment_shader(payload);
phong_fragment_shader
Eigen::Vector3f phong_fragment_shader(const fragment_shader_payload& payload)
{
Eigen::Vector3f ka = Eigen::Vector3f(0.005, 0.005, 0.005);
Eigen::Vector3f kd = payload.color;
Eigen::Vector3f ks = Eigen::Vector3f(0.7937, 0.7937, 0.7937);
auto l1 = light{
{
20, 20, 20}, {
500, 500, 500}}; // position, intensity
auto l2 = light{
{
-20, 20, 0}, {
500, 500, 500}};
std::vector<light> lights = {
l1, l2};
Eigen::Vector3f amb_light_intensity{
10, 10, 10};
Eigen::Vector3f eye_pos{
0, 0, 10};
float p = 150; // 控制高光的范围
Eigen::Vector3f color = payload.color;
Eigen::Vector3f poi