Unity中URP下的SimpleLit的 BlinnPhong高光反射计算

发布时间:2024年01月22日


前言

在上篇文章中,我们分析了 URP下的SimpleLit的 Lambert漫反射计算。

我们在这篇文章中,进行 URP下的SimpleLit的 BlinnPhone 高光反射计算的分析。


一、回顾Blinn-Phong光照模型

1、Blinn-Phong模型:

Specular = SpecularColor * Ks * pow(max(0,dot(N,H)),Shininess)

  • Specular:高光反射的最终颜色
  • SpecularColor:高光反射颜色
  • Ks:反射系数
  • N:顶点法向量
  • H:入射光线L 和 视线向量V的半角向量
  • Shininess:高光指数,用于模拟高光的范围

二、URP下的SimpleLit的 BlinnPhong

在这里插入图片描述

1、输入参数

  • lightColor:主光颜色
  • lightDir:主光方向
  • normal:法线信息
  • viewDir:视线方向向量

以上这些,我们在之前的步骤中,已经分析过了
我们主要看 specular 和 smoothness

  • specular:高光颜色
  • smoothness:光滑度
  • 这两个颜色都是在 初始化 SurfaceData 中完成的
    在这里插入图片描述
    在这里插入图片描述
  • SampleSpecularSmoothness
    在这里插入图片描述
    首先:对specularSmoothness进行了初始化
    在这里插入图片描述
    然后:如果赋予了高光纹理,则进行高光纹理的采样,赋值给specularSmoothness
    在这里插入图片描述
    在这里插入图片描述
    否则:将 高光 颜色赋予specularSmoothness
    在这里插入图片描述
    在这里插入图片描述
    最后:按 alpha 的来源给 specularSmoothness.a 赋值
    在这里插入图片描述
    在这里插入图片描述
    这个 a 经过处理后就是smoothness

half smoothness = exp2(10 * surfaceData.smoothness + 1);

  • 该处理扩大了,smoothness 的变化率,并且使其在[0,1]之间,从1开始
    在这里插入图片描述

2、程序体计算

  • 先计算出 L 和 V 的半角向量

float3 halfVec = SafeNormalize(float3(lightDir) + float3(viewDir));

  • 再计算出法线和半角向量的点积

half NdotH = half(saturate(dot(normal, halfVec)));

  • 使用 smoothness 调节高光的范围

half modifier = pow(NdotH, smoothness);

请添加图片描述

  • 混合高光颜色

half3 specularReflection = specular.rgb * modifier;

  • 混合主光颜色

return lightColor * specularReflection;

请添加图片描述

文章来源:https://blog.csdn.net/qq_51603875/article/details/135751052
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。