【问题标题】:Unity 2D Planet / Curved World ShaderUnity 2D 星球/弯曲世界着色器
【发布时间】:2016-09-13 23:30:55
【问题描述】:

我一直在尝试使用着色器创建 2D“假行星”类效果,但我得到的结果虽然有效,但效果并不好。

void vert(inout appdata_full v)
{
    //Get vertex world coordinates
    float4 worldV = mul(unity_ObjectToWorld, v.vertex);

    //Get target coordinates relative to vertex world
    worldV.xyz -= _TargetPos.xyz;

    //Transform vertex based on x distance from target
    worldV = float4(0.0f, (worldV.x * worldV.x) * -_Curvature, 0.0f, 0.0f);

    //Add this offset to vertex
    v.vertex += mul(unity_WorldToObject, worldV);
}

上面的代码是我用来产生这种效果的顶点函数,但由于它只根据玩家的 X 偏移 Y 上的顶点,它会在屏幕边缘附近产生失真。它只是看起来不太好,因为所有垂直线都保持完全垂直。

我想让它看起来更像一颗行星:

但我不知道该怎么做。

编辑:我已经尝试了几个小时来解决这个问题,我以为我已经解决了:

但是不,这不起作用。水平似乎在随机的地方弯曲和下降。

【问题讨论】:

    标签: unity3d 2d shader vertex-shader


    【解决方案1】:

    试试这个:

    float dist = sqrt((vv.x * vv.x) + (vv.z * vv.z));
    vv = float4(0.0f, dist * dist * -_Curvature , 0.0f, 0.0f);
    

    你也可以添加偏移量:

    float dist = sqrt((vv.x * vv.x) + (vv.z * vv.z));
    dist = max(0, dist - offset);
    vv = float4(0.0f, dist * dist * -_Curvature , 0.0f, 0.0f);
    

    编辑:我应该提一下 - 你不能从平面上制作一个球体。要使用这种方法制作可信的“行星”,您需要制作块并在玩家靠近时加载它们。即便如此,这也只是幻觉。更大的角度也会看起来很糟糕。

    【讨论】:

    • 感谢您的回答,但我不确定您是否完整阅读了我的问题。您向我展示的代码基本上是我发布的已经尝试过的代码,只是带有额外的 z 轴和一些偏移量。我猜这并不重要,因为当我想要完成的事情似乎几乎不可能完成时,它已经足够好了。
    • 对不起我的错。尝试找出从平面世界到弯曲世界的法线变化之间的依赖关系,然后相对于“行星”的中心旋转
    【解决方案2】:

    我正在为 Godot 引擎寻找相同的着色器。找不到,但你漂亮的草图和 cmets 给了我正确的想法。

    这是我在 Godots 着色器语言中的解决方案(类似于 GLSL ES 3.0):

    shader_type canvas_item;
    
    uniform float radius = 2.0;
    
    void fragment() {
        vec2 uv = SCREEN_UV;
        vec2 surface = vec2(0.5, 0.2);
        vec2 center = surface - vec2(0, radius);
        float base = length(uv - center);
        float height = base - radius;
        float xdiff = (uv.x - surface.x) / base * height;
        uv = clamp(vec2 (uv.x - xdiff, surface.y + height), vec2(0.0, 0.0), vec2(1.0, 1.0));
        COLOR.rgb = textureLod(SCREEN_TEXTURE, uv, 0.0).rgb;
    }
    

    没有着色器的屏幕截图:

    带着色器的屏幕截图:

    【讨论】:

      猜你喜欢
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多