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
我正在实现一个小型 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