首页 > 解决方案 > 金属中的阴影,斯威夫特

问题描述

我正在使用 Metal 和 LiquidFun 创建 2d 动画。我想模拟汽油。我希望我的动画是带有灰色阴影的黄色,类似于:

在此处输入图像描述

这是我当前的动画,它完全是黄色的,没有任何灰色阴影,所以看起来不太真实:

在此处输入图像描述

我的片段着色器现在非常简单,我只将黄色传递给它:

 fragment half4 fragment_shader(VertexOut in [[stage_in]],
                               float2 pointCoord [[point_coord]]) {
    float4 out_color = float4(0.7, 0.5, 0.1, 0.07);
    return half4(out_color);
};

我查看了有关在 MTKView 上添加阴影的各种教程,但它们都提出了对我不起作用的建议。不起作用的第一件事是创建各种顶点并为每个顶点设置颜色。在我的代码中,我没有明确的顶点,我有一个传递给顶点缓冲区的粒子系统:

   particleCount = Int(LiquidFun.particleCount(forSystem: particleSystem))
   let positions = LiquidFun.particlePositions(forSystem: particleSystem)
   let bufferSize = MemoryLayout<Float>.size * particleCount * 2
   vertexBuffer = device.makeBuffer(bytes: positions!, length: bufferSize, options: [])

我尝试过的另一件事是设置环境、漫反射和镜面反射颜色,但它也不起作用,因为我的动画是 2D,而不是 3D。

我也尝试过根据粒子位置设置颜色。我在片段着色器中的代码接近这个:

   if (in.position.y < 1500.0) {
        out_color = float4(0.7, 0.5, 0.1, 0.07);
   } else if (in.position.y > 1500.0) {
       out_color = float4(0.6, 0.5, 0.1, 0.07);
   }

但它也没有按预期工作:颜色过渡不平滑,看起来不像阴影。再加上我的动画正在增加,所以将颜色设置为明确的位置不是一个好主意。

你能建议点什么吗?我觉得我错过了一些非常重要的东西。

任何帮助表示赞赏!

标签: iosswiftshadermetal

解决方案


推荐阅读