【问题标题】:How can I set fog in scenekit to follow a curve?如何在场景包中设置雾以跟随曲线?
【发布时间】:2020-08-27 11:22:57
【问题描述】:

我试图让 Scenekit 中的雾沿着从起始距离到结束距离的曲线,而不是让它成为线性的。这是雾距离图的样子:

创建这样的体积存储雾不透明度曲线的最佳方法是什么?

我知道你可以将密度曲线设置为指数/二次曲线,我也尝试过,但我也想制作这种类型的曲线。

我尝试更改fogStartDistancefogEndDistance,但效果不正确。

【问题讨论】:

    标签: ios swift xcode sprite-kit scenekit


    【解决方案1】:

    这是我拥有的金属着色器的 sn-p,它执行“标准”雾的外观和感觉。它在 MetalKit 场景中使用,因此应该在 SceneKit 中工作,但您必须弄清楚如何将其注入场景中。上面提到的片段着色器将是一个很好的起点。

    // Metal Shader Language
    float4 fog(float4 position, float4 color){
        float distance = position.z / position.w;
        float density = 0.5;
    
    // the line that does the exponential falloff of the fog as we get closer to camera
        float fog = 1.0 - clamp(exp(-density * distance), 0.0, 1.0);
    
    // the color you want the fog to be
        float4 fogColor = float4(1.0);
        color = mix(color, fogColor, fog);
        return color;
    }
    

    希望对你有帮助

    【讨论】:

    • 如果我成功了,我会尝试宣传并更新此页面。谢谢。
    【解决方案2】:

    您可以使用自定义fragment shader modifier 来实现自己的曲线。

    【讨论】:

    • 您介意详细说明一下吗?雾的实际执行,就是这样。我找不到很多 glsl 雾。
    • 基本思想是获取物体到相机的距离。然后根据给定曲线根据该距离吸收光(“雾不透明度”)。见stackoverflow.com/questions/21549456/…
    • 您能再解释一下“光吸收”吗?它会为物体材质添加某种色调吗?
    【解决方案3】:

    这绝对可以做到,但你必须自己实现雾,因为雾只是 ZDepth 被保存出来,然后乘以最终渲染通道。

    您可以将曲线建模为 nurbs/hermite 曲线或方程,然后沿曲线采样点。

    Hermite 的时间从 0 到 1(范围从 0 到 1),这将对应于 ZDepth 值[0 在相机,1 在最远点]。

    然后将沿着 Hermite(范围 0 和 1 之间)的采样点(可以是任何值,具体取决于您对曲线的建模方式)与 ZDepth 值相乘。

    FogStartDistance 和 FogEndDistance 在距离上进行线性倍数,遗憾的是您只能指定混合的指数。

    【讨论】:

    • 您能详细说明一下吗?我不知道这将如何在 Swift 或任何语言中完成。
    • 您的请求有两个部分。获取曲线并对其进行采样,第二个是金属 ZDepth。我没有在 SceneKit 中做过这个,但会尝试解释这些位,希望你能实现它:)
    • 感谢您的详细说明。我了解对曲线进行采样,但对于实际的雾部分仍然有些困难。我会为节点材料着色还是什么?
    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2011-01-31
    相关资源
    最近更新 更多