2016-09-13 8 views
0

シェイダーを使用して2次元の「偽の惑星」エフェクトを作成しようとしていましたが、その結果はうまくいかないものです。Unity 2D Planet/Curved World Shader

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

しかし、私はこのことについて行くだろうかどうかはわかりません。

EDIT:私はこれを理解するために時間しようとしている、と私はそれを考え出したと思った:

Calculations/Diagrams (Scribbles)

しかし、これは機能しませんでした。レベルはちょうど曲がりくねっていて、無作為な場所に浸かっているようでした

答えて

0

この試してみてください:あなたはオフセットを追加できも

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); 

編集:私は言及する必要があります - あなたは、平面から球体を作ることはできません。この方法で信じられない "惑星"を作るためには、あなたが塊を作り、プレーヤーが近くにいる間にそれらをロードする必要があります。それでも、それはまさに錯覚になるでしょう。より大きな角度も悪く見えます。

+0

あなたの答えをありがとうが、あなたが私の質問を完全に読んだかどうかはわかりません。あなたが私に示したコードは、基本的に私が既に試したものとして投稿したものです。ちょうど余分なz軸とオフセットがあります。 私が達成しようとしていることがほとんど不可能と思えるほど十分に機能するので、それは重要ではないと思います。 – Jack

+0

申し訳ありませんが、私のせいです。フラットな世界から湾曲した世界への変化する法線の依存関係を理解し​​てから、 を "地球の中心" – Krajca

関連する問題