Shadow Map ———— PCSS(percentage-closer Soft Shadow)

PCSS(Percentage-Closer Soft Shadow)是一种改进的阴影映射技术,旨在解决传统PCF算法采样消耗大和半影不逼真的问题。PCSS通过动态计算采样范围和剔除非阴影点来提高效率和真实性。算法包括:渲染shadow map、Z预pass、渲染场景以及进行PCSS和PCF采样。此外,还涉及到深度偏移(Depth Bias)问题的解决,以防止阴影边缘的错误采样。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Shadow Map  ———— PCSS(percentage-closer Soft Shadow)
 
1、PCSS解决了什么问题
传统的PCF每一次采样过滤耗费很大(每次都要遍历附近的几个点,虽然用了泊松分布,但还是不可避免),PCSS算法基本解决了该问题(通过动态计算采样范围,使用FindBlocker剔除非阴影点)
传统的PCF半影不够逼真…PCSS算法通过计算准确的半影范围解决了

4、PCSS的有关你资料:
http://www.cg.tuwien.ac.at/research/publications/2013/SCHWAERZLER-2013-FPCSS/SCHWAERZLER-2013-FPCSS-draft.pdf
http://developer.download.nvidia.com/presentations/2008/GDC/GDC08_SoftShadowMapping.pdf
http://developer.download.nvidia.com/SDK/10.5/direct3d/Source/PercentageCloserSoftShadows/doc/PercentageCloserSoftShadows.pdf
http://developer.download.nvidia.com/shaderlibrary/docs/shadow_PCSS.pdf
http://developer.download.nvidia.com/whitepapers/2008/PCSS_Integration.pdf
https://developer.nvidia.com/gameworks-directx-samples(本文参照的DEMO,soft shadow)
 

PCSS算法解释:
 

第一步渲染shadowmap

Z_VSOut LightRender_VS ( Geometry_VSIn IN )
{
Z_VSOut OUT;
float4 WorldPos = mul(IN.Pos, g_world);
OUT.HPosition = mul(WorldPos, g_lightViewProj);
return OUT;
}

 
第二步、ZPrePass,减少多余的绘制
Geometry_VSOut EyeRender_VS (Geometry_VSIn I

### Unity 中 Shadowmap 的使用方法 在 Unity 中,Shadowmap 是用于计算场景中对象是否处于光源投射的阴影中的重要工具。通过预先渲染深度信息到纹理(即 Shadowmap),可以在后续光照计算阶段高效判断片段点是否位于阴影区域。 #### 启用和配置 Shadowmap 为了启用 Shadowmap 功能,在项目设置或灯光组件属性面板内调整相应选项: - **Quality Settings**: 设置全局质量等级来控制阴影分辨率和其他参数。 - **Light Component**: 对特定光源开启 `Use Shadows` 并指定阴影类型 (Hard 或 Soft)[^1]。 ```csharp // C# 脚本示例:动态修改灯光的阴影属性 using UnityEngine; public class LightController : MonoBehaviour { public void ToggleShadows(bool enable) { GetComponent<Light>().shadows = enable ? LightShadows.Soft : LightShadows.None; } } ``` #### 自定义阴影效果 对于更复杂的阴影需求,可以通过自定义着色器进一步优化阴影表现。例如应用软阴影效果或者调节边缘过渡平滑度等特性[^3]。 ```hlsl Shader "Custom/SoftShadow" { Properties { ... } // 定义材质属性 SubShader { Tags {"RenderType"="Opaque"} Pass { Name "FORWARD" CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _CameraDepthTexture; // 获取相机深度贴图 float4 CalculateShadow(float4 worldPos, float3 lightDir) { // 实现百分比接近滤波(PCSS),模拟柔和阴影 ... return finalColor; } ENDCG } } FallBack "Diffuse" } ``` #### 解决常见问题 当遇到与 Shadowmap 相关的问题时,可以尝试以下几种方案来进行排查和修复: - **剪裁面不匹配**:确保摄像机近远平面合理设定,防止过早剔除潜在可见几何体; - **精度不足引起伪影**:适当提高阴影映射纹理大小,减少因浮点数舍入造成的误差; - **性能瓶颈**:降低不必要的高分辨率阴影绘制频率,利用级联阴影地图(CSMs)分层管理不同距离范围内的细节程度;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值