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

Posted avi9111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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引擎对比,说了一些理论,有截图

以上是关于Unity3d的ShadeSH9环境光的球谐函数的应用的主要内容,如果未能解决你的问题,请参考以下文章

unity 渲染环境设置

球谐光照总结

在matlab中绘制球谐函数

球谐函数

什么是(diffuse)漫反射?镜面反射?环境光?法向量?

Unity3d BTDF实时折射模拟有粗糙度的半透明物体