[英]Unity 2D Planet / Curved World 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 上的頂點,因此它會在屏幕邊緣附近產生失真。 它只是看起來,因為所有垂直線都保持完全垂直。
我希望它做的是讓它看起來更像一顆行星:
但我不確定我會怎么做。
編輯:我已經嘗試了幾個小時來解決這個問題,我以為我已經想通了:
.
但是不,這沒有用。 水平似乎只是在隨機的地方彎曲和下降。
嘗試這個:
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);
編輯:我應該提到 - 你不能從平面上制作一個球體。 要使用此方法制作可信的“行星”,您需要制作塊並在玩家關閉時加載它們。 即便如此,那也只是幻覺。 更大的角度也會看起來很糟糕。
我正在為 Godot 引擎尋找相同的着色器。 找不到,但你漂亮的草圖和評論給了我如何處理它的正確想法。
這是我在 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;
}
沒有着色器的截圖:
帶着色器的截圖:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.