簡體   English   中英

Unity 2D Planet / Curved World Shader

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM