Unity3d的ShadeSH9环境光的球谐函数的应用

时光倒流,直接说结论

看完下面所有资料后,得知:

 

ShadeSH9 Unity内部应用在什么地方呢??

。。。

//-------------------------------------------------------------------------------------
half3 ShadeSHPerVertex (half3 normal, half3 ambient)
{
    #if UNITY_SAMPLE_FULL_SH_PER_PIXEL
        // Completely per-pixel
        // nothing to do here
    #elif (SHADER_TARGET < 30) || UNITY_STANDARD_SIMPLE
        // Completely per-vertex
        ambient += max(half3(0,0,0), ShadeSH9 (half4(normal, 1.0)));
    #else

而使用这个方法,又必须有一个前置条件

    #elif UNITY_SHOULD_SAMPLE_SH
        #ifdef VERTEXLIGHT_ON
            // Approximated illumination from non-important point lights
            ambientOrLightmapUV.rgb = Shade4PointLights (
                unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
                unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
                unity_4LightAtten0, posWorld, normalWorld);
        #endif

        ambientOrLightmapUV.rgb = ShadeSHPerVertex (normalWorld, ambientOrLightmapUV.rgb);
    #endif

参考一

Unity Standard Shader 技术分析 - 知乎 (zhihu.com)

Diffuse部分

三种环境光源都会进行Diffuse部分的计算。当物体接受LightMap的时候,环境光照会被合并到LightMap中去,而当物体不接受LightMap的时候,会使用一种在RTR4中被称为Sphere Harmonic Irradiance的技术,也就是使用球谐函数来解析的表示Irradiance Environment Map,其技术来源于Ravi Ramamoorthi,等人的文章"An Efficient Representation for Irradiance Environment Maps"。

另外Unity在进行Sphere Harmonic Irradiance的计算会根据是否使用了光照探针而有所不同。在没有使用光照探针时,会在顶点着色阶段进行Sphere Harmonic Irradiance计算,而在使用光照探针时,环境光照的Irradiance Map会被合并进光照探针中。

Specular部分

只有当使用天空盒作为环境光照的时候,才会进行Specular部分的光照计算。Unity使用的是基于经验的模糊算法。模糊的方法是通过Mipmap来进行降采样,而降采样的层级则通过着色表面的粗糙程度来确定

参考二

UNITY3D ShadeSH9 属于Irradiance environment maps 方法,可以参考DX SDK PRTDemo,里面是几乎相同的实现,总之就是解光传输的积分方程

目前主流辐射度计算的两种主流方法

1.Irradiance environment maps 辐照环境贴图方法,可用于生成柔和的环境光照,计算量比环境贴图更小 ,适合于动态环境

ShaderX2: Shader Programming Tips & Tricks with DirectX 9  中 Efficient Evaluation of Irradiance Environment Maps 一文有详细解释。

Functions can be represented/approximated
using basis functions

2.precomputed radiance transfer 预计算辐射度,这个方法实际上市将光照方程简化近似,离线计算各顶点或者像素的球谐系数,并压缩存储到顶点或者像素上,运行时重建光照,不适合于动态环境,可用于Lightmapping

ShaderX2: Shader Programming Tips & Tricks with DirectX 9  中 Practical Precomputed RadianceTransfer 一文有详细解释。

Single Spherical Harmonic Lighting Shader 

(失效链接)

https://www.assetstore.unity3d.com/en/#!/content/10307

(某引擎 ppt)

Adding Spherical Harmonic Lighting to the Sushi Engine (amd.com)

理论参考

(第2个链接说的比较好,第1个链接是纯数学??)

1.Unity Shader球谐光照解析-腾讯游戏学堂 (qq.com)

2.球谐光照(spherical harmonic lighting)解析-腾讯游戏学堂 (qq.com)

3.Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案) | 电子创新网 Imgtec 社区 (eetrend.com):优化向,不建议直接看

4.固定角色的间接光照 - 恶毒的狗 | Bad Fat Dog (baddogzz.github.io):说了一些关键字

5.球谐光照 (huailiang.github.io):自由引擎和unity引擎对比,说了一些理论,有截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值