我正在实现一个小型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-仅环境光。
b-仅漫射光。
c-并且最后只是一个最奇怪的镜面光。
自上周日以来,我一直试图解决这个问题,但仍未找到任何解决方案!
请帮忙!
谢谢 -Hans
* P.S !!光位置在(0,0,0),立方体位置在(0,0,-2),我在x和y轴上旋转了45度。很抱歉没有指定这个!
编辑:按照Rabbid76的评论,首先用fabs(lightDor.dot(p_normal));
进行测试
2-测试第二行,其中normal = position。 漫反射颜色和镜面反射颜色为黑色。
答案 0 :(得分:0)
我找到了问题的答案。 我确实混合了顺时针/逆时针原语。 这会改变法线向量的所有计算。
谢谢你@ Rabbid76