关于SHADOWMAP 的 SHADOW_EPSILON

gz_wuling 2009-08-18 09:28:19
在Directx SDK 中 有一个例子SHADOWMAP。在这个例子的HLSL(ShadowMap.fx)中有一个参数 SHADOW_EPSILON。关于这个参数的作用有多种说法:有说是为了调整误差,有说是为了把阴影放得更后一点。本人偿试过调整这个参数来观察,却很不得要领,它似乎和物体到光源的距离有关系。不知有哪位高人能指点一下。
...全文
302 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
张赐 2009-08-18
  • 打赏
  • 举报
回复
这里有个典型的数学概念

ZShadow + shadow_epsilon < Zcur
可以写成
ZShadow - Zcur < shadow_epsilon
当然这里忽略了绝对值 | ZShadow - Zcur | < shadow_epsilon
这是个极限的概念, Zcur就是它的极限。在数学中shadow_epsilon是表示任意小,但是在这里实际应用中,它就用来控制精度,就是我们认为的“任意小”
xingzhe2001 2009-08-18
  • 打赏
  • 举报
回复
离光源。

你要多个shadow_epsilon 应该也可以。
gz_wuling 2009-08-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xingzhe2001 的回复:]
因为判断像素是否在阴影中你需要与ShadowMap中保存的深度信息作比较。
如果小于就在阴影中。

但是比较的时候是两个浮点数比较,而且随着深度信息增大,深度的精度迅速减少。(你可以想象1/z这个曲线)。所以就不能直接用 ZShadow < Zcur 这样,所以引入了Shadow_epsilon来控制精度,
需要。
ZShadow + shadow_epsilon < Zcur

所以你需要阴影产生的越远,shadow_epsilon 就要越大。
[/Quote]
"所以你需要阴影产生的越远,shadow_epsilon 就要越大"请问这里的“越远”是指什么?是物体离镜头的距离还是物体离光源的距离?还是其他什么?如果有多组不同位置的物体,是否需要设多个shadow_epsilon ?
xingzhe2001 2009-08-18
  • 打赏
  • 举报
回复

这么说吧,我们判断 ZShadow < Zcur 实际上是判断 Zcur - zShadow > 0。在浮点运算里是不能这么做的,因为浮点的精度问题,当Zcur - zShadow 足够小的时候就认为等于0了,由于离摄像机较远的地方Zcur 和 zShadow的值很接近1,Zcur - zShadow的值很小,可能很像素的这个值都在0.0000000002直接,你把Shadow_epsilon设为0可以看到很多像素都被误认为是在阴影中,失真很厉害。如果我们采用
Zcur - zShadow > Shadow_epsilon,那么就设了一个门槛,只有两个z值足够远的时候才产生阴影,效果就好多了。
张赐 2009-08-18
  • 打赏
  • 举报
回复
shadow_epsilon 就是用来控制精度的变量
浮点数常常这样来控制它的精度
xingzhe2001 2009-08-18
  • 打赏
  • 举报
回复
因为判断像素是否在阴影中你需要与ShadowMap中保存的深度信息作比较。
如果小于就在阴影中。

但是比较的时候是两个浮点数比较,而且随着深度信息增大,深度的精度迅速减少。(你可以想象1/z这个曲线)。所以就不能直接用 ZShadow < Zcur 这样,所以引入了Shadow_epsilon来控制精度,
需要。
ZShadow + shadow_epsilon < Zcur

所以你需要阴影产生的越远,shadow_epsilon 就要越大。

8,306

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧