软阴影,在SceneKit中的阴影模糊

15

我添加了一个节点,并尝试使用SceneKit设置阴影模糊。

这是我的灯光配置,我尝试设置shadowRadius。

light = [SCNLight light];
light.type = SCNLightTypeDirectional;
light.castsShadow = true;
light.shadowMode = SCNShadowModeForward;
light.shadowRadius = 5;
light.shadowMapSize=CGSizeMake(4000, 4000);
light.orthographicScale=25;
light.zNear=1;
light.zFar=1000;

但是当我没有设置shadowRadius时,结果并不比较柔和。这里是它的图片:enter image description here

我尝试添加samplecount

light = [SCNLight light];
light.type = SCNLightTypeDirectional;
light.castsShadow = true;
light.shadowMode = SCNShadowModeForward;
light.shadowRadius = 5;
// add samplecount
light.shadowSampleCount = 5;
light.shadowMapSize=CGSizeMake(4000, 4000);
light.orthographicScale=25;
light.zNear=1;
light.zFar=1000;

结果看起来像下面这样 在此输入图片描述

阴影似乎很柔和,但这个阴影是从节点底部开始的(z坐标为0)。我花了很多时间只在节点边缘设置柔和阴影,而不是从底部开始。但没有结果。

当两个节点相交时(不仅仅是节点和SCNFloor几何图形),也会出现这个问题。

我的问题是如何获得带有方向光源的阴影模糊(柔和阴影)。

任何帮助将不胜感激!


从https://learn.microsoft.com/en-us/windows/win32/dxtecharts/common-techniques-to-improve-shadow-depth-maps,我猜测你看到的问题可能是所谓的“彼得潘效应”?我希望苹果能够为SceneKit提供更好的概念和编程指南类型的内容。今天,下面提到的`automaticallyAdjustsShadowProjection`属性甚至还没有被记录在案。 - stephent
2个回答

5

Swift 4 / Xcode 9.2

这里有一些设置,可以得到不错的结果:

light2.castsShadow = true
light2.automaticallyAdjustsShadowProjection = true
light2.maximumShadowDistance = 20.0
light2.orthographicScale = 1

light2.shadowMapSize = CGSize(width: 2048, height: 2048)
light2.shadowMode = .forward
light2.shadowSampleCount = 128
light2.shadowRadius = 3
light2.shadowBias  = 32

shadowRadius增加到12对我的模型有很大帮助,但随后我需要增加shadowSampleCountshadowBias以避免产生伪影。


1

我真的可以使用orthographicScale创建阴影模糊效果。我不知道为什么,但这个技巧对我很有效。希望能帮到别人。

light.shadowMapSize=CGSizeMake(4000, 4000);
light.orthographicScale=100; // bigger is softer

我还将 shadowMapSize 更改为更大的值,并设置了 isJitteringEnabledantialiasingMode 以减少走样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接