Phong光照:单独或与周围添加镜面照明和扩散?(Phong lighting: add specu

2019-09-28 18:22发布

我想实现Phong光照。 在一些教程镜面照明被添加到环境和漫射照明,然后总照明由纹理颜色相乘。 我还看到,其中在加入的环境和漫灯带纹理颜色乘以后单独加入镜面照明的教程。

下面是本两个选项,并用屏幕截图的片段着色器。

#version 330 core
out vec4 FragColor;

in vec2 TexCoord;
in vec3 normals;
in vec3 fragPosition;


//texture samplers
uniform sampler2D texture1;
uniform vec3 ambientLight;
uniform vec3 lightPosition;
uniform vec3 lightColor;
uniform vec3 viewPosition;
uniform float specularStrength;
uniform float shineDamp;

void main()
{
    vec3 norm = normalize(normals);
    vec3 lightDir = normalize(lightPosition - fragPosition); 

    float diff = max(dot(norm, lightDir), 0.0);
    vec3 diffuse = diff * lightColor;

    vec3 viewDir = normalize(viewPosition - fragPosition);
    vec3 reflectDir = reflect(-lightDir, norm);
    float spec = pow(max(dot(viewDir, reflectDir), 0.0), shineDamp);
    vec3 specular = specularStrength * spec * lightColor;  

    // 1. Specular is added to ambient and diffuse lights and this result is multiplied with texture
    //FragColor = vec4((ambientLight + diffuse + specular), 1.0f) * texture(texture1, TexCoord);

    // 2. Specular is added separately to result of multiplication of ambient + diffuse and texture
    //FragColor = vec4((ambientLight + diffuse), 1.0f) * texture(texture1, TexCoord) + vec4(specular, 1.0);
}
  • 选项1镜面被添加到环境和漫

  • 选项2镜面单独加入。

在这些截图shineDump值为32.0f和specularStrength是0.5F。

哪一个看起来是正确的? 在我看来,相比于第一一个第二选择看起来是正确的,但有很多教程使用公式从第一选项。

Answer 1:

我想实现Phong光照。 在一些教程镜面照明被添加到环境和漫射照明,然后总照明由纹理颜色相乘。

这是从黑暗时代历史的神器,当光照方程仍然在GPU的硬连线,当洛德着色是标准的。 光模型只是在顶点处进行评价,并在整个原始产生的光值进行内插。 由于纹理通常被用来模拟的材料的表面特性,纹理通常在每个片段采样(这样我们可以给结构提供了超出在几何中指定的级别的原语)。 但由于洛德着色,我们需要每个片段的纹理数据来调制已计算出的光值。 最简单的方法是只乘两者。

我还看到,其中在加入的环境和漫灯带纹理颜色乘以后单独加入镜面照明的教程。

由纹理颜色转换整个照明给出了大量的材料不切实际的结果。 为了解决这些问题,所述镜面部分有时分离。 我们现在计算amibient +扩散部分和每个顶点的镜面部分,内插的那些,调制环境+与所述纹理扩散,之后添加镜面部分,每片段。

然而,没有人会使用高洛德着色现在,我们不是计算每个片段的照明。 我们没有对光照模型的评估和纹理的任何更多的采样频率不同,所以这些问题变得毫无意义。 由于通过一些表面反射的实际的光取决于材料,并且我们使用纹理来模拟材料,我们可以直接使用纹理作为照明计算的输入 ,即作为漫反射率,或镜面反射性,或任何。 这也让我们在整个原始的,不只是“颜色” 任意改变材料性能,光泽/粗糙度以及来自纹理法线方向和任何参数的光照模型可以使用。



Answer 2:

通常,在计算机图形的光通过双向反射分布函数(BRDF)建模。 所述BRDF是一个函数,给出了沿出射方向与光入射从进入的方向反射的光之间的关系。

一般来说BRDF模型可分为一两个类别:

  • 经验 :它们的主要目的是提供特别设计用于模拟一种反射的简单的制剂。 因此,我们得到的参数可调的快速计算模型,但没有考虑到它背后的物理学。
  • 理论 :这些模型试图通过使用物理定律来精确地模拟光散射。 他们通常会导致复杂的表达和高计算工作量,因此它们通常不会在渲染系统使用。
  • 实验 :本BRDF可以使用获取Gonioreflectometer机械地改变光源和传感器的位置。 其他技术使用数码相机采集许多BRDF样品单张照片。

见futher:

  • 双向反射分布函数
  • BRDF的调查研究表示计算机图形学
  • 罗萨娜蒙特斯和卡洛斯·乌雷尼亚,BRDF模型概述
  • 西蒙的技术博客-微面BRDF
  • BRDF浏览器


该海防模型是一个经验各向同性模型。 由于两个,经验和理论取得BRDF模型是真材实料的反射特性的只是近似值,它是完全地给你,到deside一个BRDF的场景和表面的外观。



文章来源: Phong lighting: add specular lighting separately or with ambient and diffuse?