1. 启用UNITY_NO_SCREENSPACE_SHADOWS宏时TRANSFER_SHADOW宏的定义 2. 启用UNITY_NO_SCREENSPACE_SHADOWS宏时的unitySampleShadow函数 3. 未启用UNITY_NO_SCREENSPACE_SHADOWS宏时TRANSFER_SHADOW宏的定义 4. UNITY_SAMPLE_SCREEN_SHADOW宏和UNITY_DECLARE_SCREENSPACE_SHADOWMAP宏的定义 三、Unity 3D 5.6版本后的阴影...
这张纹理也是靠内置的一个Shader渲染得到的。从Unity 5.4的Frame Debugger里看到的这个Pass的名称是Hidden/Internal-ScreenSpaceShadows(在DefaultResourcesExtra/Internal-ScreenSpaceShadows.shader)。这个Pass在不同的Unity版本里是不一样的,比如在Unity 5.3里面就是Internal-PrePassCollectShadows(在DefaultResources/Internal...
//*行光源#if defined (SHADOWS_SCREEN)// 非屏幕空间的shadow map#if defined(UNITY_NO_SCREENSPACE_SHADOWS)#define TRANSFER_SHADOW(a) a._ShadowCoord = mul( unity_WorldToShadow[0], mul( unity_ObjectToWorld, v.vertex ) );#else#define TRANSFER_SHADOW(a) a._ShadowCoord = ComputeScreenPos(a....
#if defined (SHADOWS_SCREEN) #if defined(UNITY_NO_SCREENSPACE_SHADOWS) && !defined(UNITY_HALF_PRECISION_FRAGMENT_SHADER_REGISTERS) //片元坐标保持不变,转到光源空间下进行采样 realtimeShadowAttenuation = unitySampleShadow(mul(unity_WorldToShadow[0], unityShadowCoord4(worldPos, 1))); #else //转...
TRANSFER_SHADOW 首先会判断当前平台是否可以使用屏幕空间的阴影映射技术(通过判断是否定义了 UNITY_NO_SCREENSPACE_SHADOWS);如果支持就会调用内置的ComputeScreenPos函数来计算_ShadowCoord;如果不支持就会使用传统的阴影映射技术,先把顶点坐标从模型空间变换到光源空间后存储到_ShadowCoord中。
Screen Space shadows与 PC/游戏主机平台上的方向光的级联阴影贴图结合使用。 Motion vectors用于基于对象的运动矢量计算。 Lens Flare与镜头光晕结合使用。 Light Halo与光环结合使用。 对于每个功能,可以选择要使用的着色器类型: No Supportdisables this calculation. Use this setting if you are not using deferred...
UNITY_NO_SCREENSPACE_SHADOWS在不使用级联屏幕空间阴影贴图的平台(移动平台)上定义。 UNITY_NO_LINEAR_COLORSPACE在不支持线性颜色空间的平台(移动平台)上定义。 UNITY_NO_RGBM在不使用光照贴图 RGBM 压缩的平台(移动平台)上定义。 UNITY_NO_DXT5nm在不使用 DXT5nm 法线贴图压缩的平台(移动平台)上定义。
而TRANSFER_SHADOW会根据平台差异来判断,如果可以使用UNITY_NO_SCREENSPACE_SHADOWS来得到,TRANSFER_SHADOW会调用内置的ComputeScreenPos函数来计算_ShadowCoord;如果不支持屏幕空间的阴影映射技术,就会使用传统的阴影映射函数来计算。 TRANSFER_SHADOW会把顶点坐标从模型空间变换到光源空间后存储到_ShadowCoord中。然后SHADOW_ATT...
Unity 5 中,Unity 使用了不同于这种传统的阴影采样技术,即屏幕空间的阴影映射技术(Screenspace Shadow Map)。其原理是:先生成相机的深度纹理和灯光的阴影映射纹理,对于场景中任意一点,以其深度纹理的 x、y 值和阴影映射纹理的 z 值作为该点的屏幕空间阴影映射纹理。注意:Unity 并没有在所有平台上都使用了这种技术...
如果当前平台可以使用屏幕空间的阴影映射技术(通过判断是否定义了UNITY_NO_SCREENSPACE_SHADOWS来得到 ),TRANSFER_SHADOW会调用内置的ComputeScreenPos函数来计算_ShadowCoord:如果该平台不支持屏幕空间的阴影映射技术,就会使用传统的阴影映射技术,TRANSFER_SHADOW会把顶点坐标从模型空间变换到光源空间后存储到_ShadowCoord中。