欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基本的光照模型 D04

程序员文章站 2024-03-15 08:43:11
...
4.1 光源对物体照明的分类(直接/间接)
  • 间接照明
    光在物体间传播后,最终又对物体形成照明(光2次反弹?)。VRay通过光线跟踪较真实的计算了光源的直接照明和间接照明。
  • 直接照明 -----(实时渲染的计算重点)
    不考虑光线在物体间的传播,也不考虑光线在物体内部的传播,则光线对物体对物体直接照明
    照明的结果是分为漫反射(和视角无关?)和镜面反射(强烈高光和视角有关?)
4.2 光照模型(照明的计算方式)
  • 漫反射和Lambert
    ----粗糙物体表面的一个点,其亮度取决于(LightDir)入射光线 和 (Normal)该点的法线方向
    L :入射光线, (Normalized)
    N: 点的法线(Normalized)
    C :光线强度/颜色
    Lum : 物体此点表面的亮度
    Lum =C * max(0,cos<N ,L >)
    Cg标准函数库用 dot(N,L) cos为为负值,背光 ,max(0,value)函数的作用是对结果进行调整。

Unity的Surface Shader ,有两个内置的Light Model 函数 Lighting.cginc

  1. LightLambert()对应于 ForWard渲染路径简单照明方式
inline fixed4 LightingLambert( SurfaceOutPut s , fixed3 lightDir,fixed atten)
{
  fixed diff = max(0.0,dot(s.Normal,lightDir));// 漫反射
  fixe4 c
  // 计算了物体表面的纹理颜色,光源颜色以及光源强度
  c.rgb = S.Albedo * _LightColor0.rgb * (diff * atten * 2);
  c,a = s.Alpha ;
  return c ;
}
  1. LightLambert_PrePass()**对应于Deferred渲染路径下的简单照明方式
  • 镜面高光和Phong(视角有关)
    I 入射光线 (Normalized)
    N 法线 (Normalized)
    R 光反射方向
    V 视角方向
    R = Reflect( I , N) // 此函数仅对三元向量有效
    Spec = pow(max(0.0,dot<R,V>),gloss) // pow(x,y)作用迅速衰减
    Lambert + Phong 就可以渲染出一个高光的物体。

- 半角向量和BlinnPhong
----- 半角向量 H:入射光线 I 和视角方向 V 的平均值

half3 H = normalized(lightDir + ViewDir) //相加( 除以2 ?) 归一化 !

Unity的Surface Shader, Unity在Lighting.cginc 中提供了两个Blinnphong的实现, 分别对应于ForWard和Deferred渲染路径。 对应于ForWard渲染路径的是

inline fixed4 LightingBlinPhong(SurfaceOutput s, fixed3 lightDir, half3 ViewDir, fixed atten)
{
  half3 h = normalize(lightDir + ViewDir); // 半角向量 归一化
  fixed diff = max(0.0,dot(s.Normal,lightDir)); // Lambert
  fixed ndoth = max(0.0,dot(s.Normal,h));// BilnnPhong
  float spec = pow(ndoth,s.Specular * 128.0) * s.Gloss ;
  fixed4 c ;
  c.rgb = (s.Alebdo * _LightColor0.rgb * diff +_LightColor.rbg * _SpecColor.rgb * spec) * (atten * 2);
  c.a = s.Alpha + _LightColor.a * _SpecColor.a * spec * atten;
  return c; 
}
相关标签: shader