着色模型和光照模型

#着色模型:

  • 高洛德着色(Gouraud shading):即基于顶点计算颜色后在渲染的图元内部进行线性插值。当光照模型中有非线性的计算时(如计算高光反射),这种逐顶点的光照就会出问题。另外由于是图元内部线性插值,会导致渲染图元内部的颜色总是暗于顶点处,在某些情况下会产生明显的棱角现象。
  • Phong着色(Phong shading):即在片元上计算颜色,需要对顶点法线进行插值然后进行光照模型的计算。

#标准光照模型:
最终的光照颜色由自发光(emissive), 漫反射(diffuse),高光反射(specular)和环境光(ambient)相加得到。这是一个经验模型。也称作Blinn-Phong光照模型。

  • 兰伯特模型(Lambert’s law): 计算漫反射 C diffuse = (Clight * m_diffuse) max(0, dot(n,I)) (其中n是表面法线,I是入射光线的反方向)
  • 半兰伯特模型:对兰伯特模型进行一个简单的修改 C diffuse = (Clight * m_diffuse)(a * dot(n,l) + b)
    半兰伯特模型没有使用max防止点积为负值,而是对点积结果进行缩放和偏移。大多数情况下,a和b取0.5,这样将点积值从[-1,1]映射到[0,1]范围内。也就是说,对于模型背光面也不会全黑,而会有明暗变化。
  • Phong模型:计算高光的反射 Cspecular = (Clight * m_specular) max (0, dot(v,r)) ^m_gloss (其中v是视线反方向,r是光反射方向)
  • Blinn模型:避免计算反射方向 r, 改为计算half向量 h, 即 v和I的中间方向, h = (v+I) / |v+I| ,然后使用n和h的夹角进行计算(而非v和r)
    Cspecular = (Clight * m_specular) max(0, dot(n,h)) ^ m_gloss

你可能感兴趣的:(图形学与OpenGL)