tropher

@tropher

  • 我注意到你渲染的模型身上有一些小竖线,这可能是在三角形光栅化时忽略了边界,应该要把边界也考虑进去。

    Post #2
  • 感谢 roland 学长和 KON 同学的回答。
    我发现问题是出在法线的计算上,于是做出了更改。

    但是渲染结果出现了下面的问题:
    renderer_image|663x500

    原本是高光的地方变成了黑色。

    image|162x301

    然后我打印出了像素点的 result,也就是 rgb 值。发现本应是白色的像素点,它的 rgb 值却大于 255。

    然后我使用 if 语句,把所有 rbg 值大于 255 的像素点的颜色全部赋值为 255。得到了如下结果:

    if_rbg_to255|661x500

    请问我能否把原本应该是白色的,却因为 rgb 值大于 255 的像素点的颜色赋值为 255,这样算是作弊吗?

    另外附上分别只有 ambient,diffuse,specular 的三张渲染图:

    ambient
    only_ambient|668x500

    diffuse
    only_diffuse|662x500

    specular
    only_specular|670x500

    Post #5
  • 我试着将光源设置到 (1,1,1) 以及更小时,计算得到的 specular 始终很小。
    单输出 specular 的渲染结果,也跟之前一样是一片漆黑。

    但输出 ambient+diffuse+specular 时,渲染结果如下图:

    光源设置为 (0.9,0.9,0.9)|662x500

    输出的 result 几乎只有 diffuse 在做贡献。

    不好意思,学长。我可能是太笨了,没有理解您所说的计算距离时某个向量没有归一化。

    我所使用的计算距离的公式如下:

    float distance = (light.position - payload.world_pos).norm();
    // payload.world_pos 相机坐标系/世界坐标系 插值后的坐标都尝试过
    

    实际上就是 lightDir 取模。我不清楚哪个向量需要归一化。如果我理解有误,请您指出来。

    Post #4
  • 根据学长的提示,我打印出了计算 specular 需要的中间变量。

    specular 中间变量|333x500

    其中的 attenuated_light 按照下列公式计算:

    Eigen::Vector3f attenuated_light = light.intensity / distance_square * Eigen::Vector3f(1, 1, 1);
    

    截图中的 normalized_normal 和 normalized_halfVector 点乘后得到结果很小,在经过 10 次方后变成了一个几乎为 0 的数。

    请问学长,我使用的公式是否有误?
    另外,传入 phong_fragment_shader 函数的变量是否相机坐标系中经过插值的三角形顶点和法线?

    Post #3
  • 我记得 pdf 版文档中提到过,转换到世界坐标系或是相机坐标系都可以。如果是转换到世界坐标系,则还要在 vertex shader 函数外再把法线转换到相机坐标系,以供插值时使用。

    Post #2
  • 三角形顶点左乘 MVP 矩阵应该还没有到视口空间。
    我自己的理解是,模型坐标系的三角形的顶点坐标左乘 MVP 矩阵后,应当处于一个相机坐标系到 NDC 之间的状态(也就是刚刚做完透视投影)。此时,三角形的顶点坐标(x,y,z)再除以它的第四维 w,就是到了 NDC 空间。
    然后再左乘一个视口变换矩阵,就到了屏幕空间(即 pdf 版文档中的 screen space,好像也称作视口空间)。

    当然,我自己也没渲染成功 😭,以上也仅供你参考参考。

    Post #2