我一直在尝试使用着色器创建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上的顶点,所以它会在屏幕边缘附近产生失真。它只是向下看,因为所有垂直线都保持完全垂直。
我希望它能让它看起来更像一个星球:
但我不确定我会怎么做。
编辑:我一直在努力解决这个问题,我想我已经弄清楚了:
。
但不,这不起作用。水平似乎在随机的地方弯曲和下降。
答案 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
没有着色器的屏幕截图:
使用着色器截屏: