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

时间:2018-01-10 15:13:06

标签: 3d shader light

我正在实现一个小型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-将位置和法线转换为眼睛空间。 模型视图矩阵和法线的位置与模型视图矩阵的反转置。

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 =&gt;环境光,漫反射光,镜面光组件值)。

这是我从计算中得到的。

a-仅环境光。

ambient light

b-仅漫射光。

Diffuse light

c-并且最后只是一个最奇怪的镜面光。

Spec?

自上周日以来,我一直试图解决这个问题,但仍未找到任何解决方案!

请帮忙!

谢谢 -Hans

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

编辑:按照Rabbid76的评论,首先用fabs(lightDor.dot(p_normal));进行测试

1-环境和规格没有变化。 但漫反射颜色发生了变化。 Diffuse Color changed

2-测试第二行,其中normal = position。 漫反射颜色和镜面反射颜色为黑色。

1 个答案:

答案 0 :(得分:0)

我找到了问题的答案。 我确实混合了顺时针/逆时针原语。 这会改变法线向量的所有计算。

谢谢你@ Rabbid76

相关问题