• vue2源码分析-响应式原理


    正文

    下面的 OSL 材质模拟了 Tony Reynolds 制作的皮肤着色器,它采用了由红、绿、蓝波长调制的分层次表面散射(layered subsurface scattering)。此外,着色器实现了一个 Dual lobe Speculartwo-lobe spec,双叶瓣高光)来捕捉人类皮肤上高光的微妙变化。

    理论

    不同波长的光穿透皮肤的深度不同。如果我们将可见光谱简化为三种颜色(红、绿、蓝),那么每一种颜色的平均自由路径(光子在被散射或吸收之前穿过特定物质的距离)的值就会不同。对于人类的皮肤来说,红色是最深的,然后是绿色蓝色是相当浅的。

    color Depth = getTextureDif(RGB_Scatter_Depth, color(0.8,0.2,0.1));
    ...
    color SubColor = getTextureDif(Subsurface_Color, color(0.85,0.75,0.65));
    ...
    color SubR = SubColor * color(1,0,0);
    color SubG = SubColor * color(0,1,0);
    color SubB = SubColor * color(0,0,1); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    基于以上理论,着色器将主颜色纹理(次表面颜色)分离为红色、绿色和蓝色部分,并将这些部分输送到三个次表面着色器中,然后将它们组合在一起。这三个次表面着色器的深度(即平均自由路径)由相应的 RGB_Scatter_Depth 颜色的红、绿、蓝通道驱动。为了加快速度,将绿色和蓝色结合在一起,所以着色器将两个 SSS 闭包组合在一起(红+绿&蓝)而不是三个。

    closure color SSS = vray_subsurface ( IOR, PhaseFunction, Depth * Depth_Scale * 0.5, SubColor * Subsurface_Amount, "subdivs", Subdivs);
    	closure color SkinR = vray_subsurface ( IOR, PhaseFunction, SubR * Depth[0] * Depth_Scale, SubR * Subsurface_Amount, "subdivs", Subdivs); closure color SkinGB = vray_subsurface ( IOR, PhaseFunction, ((SubG * Depth[1]) + (SubB * Depth[2])) * Depth_Scale, (SubG + SubB) * Subsurface_Amount, "subdivs", Subdivs); 
    
    • 1
    • 2

    所基于的想法是,所有人类的主要散射颜色是红色(因为我们在不同的肤色下都有红色的血液)。

    换句话说,RGB 散射深度本身并不是一种颜色,而是分别代表红、绿、蓝三种波长的散射系数。因此,将波长 RGB 深度颜色的红色通道设置为 1.0 意味着红色波长的深度是 100% ,而将其设置为 0.7 意味着它是 70%,以此类推,对于所有三个 RGB 通道。

    请注意,在下图中,红色通道比绿色或蓝通道更柔和,因为它有更多的深度。

    • RGB 散射深度值: 1.0, 0.4, 0.2

    优缺点

    这种方法的另一个好处是,当它设置的散射量较大时,它几乎消除了 SSS2 材质的薄部分可能出现的 “绿色误差”,因为它将多个次表面着色器线性混合在一起,而不像在 SSS2 材质将中次表面和散射颜色之间进行更复杂的相互作用,虽然更 物理正确,但对艺术家来说可能 不直观

    总的来说,这个着色器的 重点 是优先考虑 艺术控制 而不是 物理正确性 。像 VraySkinMtl 这样的分层皮肤着色器的一个 缺点 是,用户需要将不同(通常 不直观)的颜色混合在一起到达想要的皮肤颜色。

  • 相关阅读:
    14天学习训练营之 初识Pygame
    【数据结构初阶】九、排序的讲解和实现(直接插入 \ 希尔 \ 直接选择 \ 堆 \ 冒泡 -- C语言)
    面向桥隧施工工地的环境参数监测与通风控制系统设计
    音乐偏好度推荐系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
    关于组织开展2022年广东省技术先进型服务企业认定工作的通知
    opensips开启python支持
    云原生:Docker 实践经验(六)-镜像的使用及分层讲解
    [axios]使用指南
    HTML+CSS大作业【传统文化艺术耍牙15页】学生个人网页设计作品
    java实体类中,对某些属性进行equals和hashCode设定,通过对设定属性来判断对象是否相等
  • 原文地址:https://blog.csdn.net/web220507/article/details/127579211