Unity 2D Planet / Curved World Shader

时间:2016-09-13 23:30:55

标签: unity3d 2d shader vertex-shader

我一直在尝试使用着色器创建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上的顶点,所以它会在屏幕边缘附近产生失真。它只是向下看,因为所有垂直线都保持完全垂直。

我希望它能让它看起来更像一个星球:

Difference Image

但我不确定我会怎么做。

编辑:我一直在努力解决这个问题,我想我已经弄清楚了:

Calculations/Diagrams (Scribbles)

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

2 个答案:

答案 0 :(得分:0)

试试这个:

{@ypdiff, u}

你也可以添加偏移量:

float dist = sqrt((vv.x * vv.x) + (vv.z * vv.z));
vv = float4(0.0f, dist * dist * -_Curvature , 0.0f, 0.0f);
编辑:我应该提一下 - 你不能从飞机上制造一个球体。要使用这种方法制作可信的“星球”,你需要制作块并在玩家关闭时加载它们。即使这样,它也只是幻觉。更大的角度也会看起来很糟糕。

答案 1 :(得分:0)

我正在为Godot Engine寻找相同的着色器。找不到一个,但是您的漂亮草图和注释为我提供了正确的方法。

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

nameof

没有着色器的屏幕截图: Screenshot without shader

使用着色器截屏: Screenshot with shader