【GAMES 101】作业3的实现和思考


本文为闫令琪老师的GAMES 101课程的作业3的个人实现与一些简单的思考,文中如有错漏欢迎指出。

作业要求

  1. 修改函数rasterize_triangle(const Triangle& t) in rasterizer.cpp:在此处实现与作业2类似的插值算法,实现法向量、颜色、纹理颜色的插值。

  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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值