blinn_phong 立方体上的照明、漫反射和镜面光无法正常工作

blinn_phong illumination on a cube, Diffuse and Specular light are not working properly

我正在实现一个小型 3d 渲染器,但我被困在 blinn_phong 照明模型上。

这些是我到目前为止所做的步骤。

1-计算所有顶点法线

for (uint16_t i = 0; i < Cube->m_indices.size() - 2; i+= 3)
{
    Vec3 Normal;
    Vec3 p1(Cube->m_vertices[Cube->m_indices[i + 1]].position - Cube->m_vertices[Cube->m_indices[i]].position);
    Vec3 p2(Cube->m_vertices[Cube->m_indices[i + 2]].position - Cube->m_vertices[Cube->m_indices[i]].position);
    Normal = p1.Cross(p2);
    Normal.Normalize();
    Cube->m_vertices[Cube->m_indices[i]].normal = Cube->m_vertices[Cube->m_indices[i]].normal + Vec4(Normal, 0);
    Cube->m_vertices[Cube->m_indices[i + 1]].normal = Cube->m_vertices[Cube->m_indices[i + 1]].normal + Vec4(Normal, 0);
    Cube->m_vertices[Cube->m_indices[i + 2]].normal = Cube->m_vertices[Cube->m_indices[i + 2]].normal + Vec4(Normal, 0);
}

for (uint16_t i = 0; i < Cube->m_vertices.size(); ++i)
{
    Cube->m_vertices[i].normal.Normalize();
}

2- 将位置和法线转换为 eye-space。 具有模型视图矩阵的位置和具有模型视图矩阵的逆转置的法线。

3- 使用重心坐标计算每个像素的法线。

4-计算blinn_phong

Color Rasterizer::BlinnPhongColor(Vertex p_position, Vec3 p_normal, Vertex p_lightPosition, Vec3 p_lightcomp, Color p_color)
{
  Vertex position1(Mat4::ScreenToView(p_position.position, 
  m_rtexture.GetWidth(), m_rtexture.GetHeight()));

  Vec3 lightDir(p_lightPosition.position - position1.position);
  lightDir.Normalize();

  float lambert = std::max(lightDir.dot(p_normal), 0.0f);
  float specular = 0.0f;

  if (lambert > 0.0f)
  {
     Vec3 viewDir = (position1.position *-1);
     viewDir.Normalize();

     Vec3 halfDir = (lightDir + viewDir);
     halfDir.Normalize();

     float specAngle = std::max(halfDir.dot(p_normal), 0.0f);
     specular = pow(specAngle, 14.0);
  }
  Color amb = p_color * (p_lightcomp.x);
  Color diff = p_color * (p_lightcomp.y * lambert);
  Color spec = Color(255, 255, 255) * (p_lightcomp.z * specular);
  Color total = spec;
  return total;
} 

*(p_lightcomp.x ,y z => 环境光、漫反射光、镜面光分量值)。

这是我通过计算得到的。

a- 仅限环境光。

b- 仅漫射光。

c- 最后只有最奇怪的镜面光。

从上周日开始我一直在尝试解决这个问题,但仍然找不到任何解决方案!

请帮忙!

谢谢 -汉斯

*P.S!!光源位置在 (0,0,0),立方体位置在 (0,0, -2),我在 x 轴和 y 轴上旋转了 45 度。很抱歉没有指定这个!

编辑:根据 Rabbid76 的评论,首先使用 fabs(lightDor.dot(p_normal));

进行测试

1- 环境和规格没有变化。 但漫反射颜色改变了。

2- 使用第二行进行测试,其中 normal = 位置。 漫反射颜色和镜面反射颜色为黑色。

我找到了问题的答案。 我确实混合了 clockwise/counterclockwise 个原语。 这会更改法向量的所有计算。

谢谢@Rabbid76