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)
4.固定角色的间接光照 - 恶毒的狗 | Bad Fat Dog (baddogzz.github.io):说了一些关键字
以上是关于Unity3d的ShadeSH9环境光的球谐函数的应用的主要内容,如果未能解决你的问题,请参考以下文章