2017-11-27 18 views
1

Ich habe Probleme, Objekte (z. B. eine Ebene) auf eine sphärische Oberfläche zu projizieren.Spherical Mapping

Der Shader muss nur die lokale Scheitelposition (P0) übernehmen, in Weltkoordinaten (P1) umrechnen und dann den Vektor von einem gegebenen Zentrum (C) zu P1 (P1 - C) finden. Normalisieren Sie diesen Vektor und multiplizieren Sie ihn mit einem gegebenen Koeffizienten und konvertieren Sie ihn zurück in lokale Koordinaten.

Ich arbeite in der Einheit mit der Oberfläche Shadern

Shader "Custom/testShader" { 
    Properties { 
     _MainTex("texture", 2D) = "white" {} 
     _Center("the given center", Vector) = (0,0,0) 
     _Height("the given coefficient", Range(1, 1000) = 10 
    } 
    Subshader { 
     CGPROGRAM 
     #pragma surface surf Standard vertex:vert 
     sampler2D _MainTex; 
     float3 _Center; 
     float _Height; 

     struct Input { float2 uv_MainTex; } 

     // IMPORTANT STUFF 
     void vert (inout appdata_full v) { 
     float3 world_vertex = mul(unity_ObjectToWorld, v.vertex) - _Center; 
     world_vertex = normalize(world_vertex) * _Height; 
     v.vertex = mul(unity_WorldToObject, world_vertex); 
     } 
     // END OF IMPORTANT STUFF 

     void surf (Input IN, inout SurfaceOutputStandard o) { 
     o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb; 
     } 
     ENDCG 
    } 
} 

Das Problem ist jetzt in der Szene, dass, wo ich einige Flugzeuge mit diesem Shader haben, sehen sie aus Split und vieles mehr wenig das, was sie eigentlich sein. Irgendwelche Ideen?

EDIT

Hier sind einige Screenshots: The meshes without the shader The same meshes with the shader

+0

sein Können Sie Schnappschüsse Ihrer Eingabe und Ausgabe von Objekten aus Unity schreiben? –

Antwort

2

Sie wandeln world_vertex als eine Richtung (X,Y,Z,0) anstelle von Position (X,Y,Z,1). Weitere Informationen finden Sie unter this.

Also diese Linie
v.vertex = mul(unity_WorldToObject, world_vertex);
sollte
v.vertex = mul(unity_WorldToObject, float4(world_vertex, 1));

+0

Vielen Dank, ich werde das Tutorial lesen, das du mindestens achtmal verlinkt hast! – Gugu