2016-09-13 2 views
0

J'ai essayé de créer un effet de type "fake planet" 2D en utilisant des shaders, mais le résultat que j'ai obtenu, même s'il fonctionne, n'est pas génial.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); 
} 

Le code ci-dessus est la fonction de sommet que j'utilise pour produire cet effet, mais comme il ne compense que les sommets du Y basés sur X du joueur, il produit une distorsion près du bord de l'écran. Il regarde juste, puisque toutes les lignes verticales restent complètement verticales.

Ce que je voudrais à faire est de faire apparaître plus comme une planète:

Difference Image

Mais je ne sais pas comment j'aller à ce sujet.

EDIT: Je ai essayé pendant des heures pour comprendre cela, et je pensais que je l'avais pensé à elle:

Calculations/Diagrams (Scribbles).

Mais non, cela n'a pas fonctionné. Le niveau semblait juste s'incurver et plonger dans des endroits aléatoires.

Répondre

0

Essayez ceci:

float dist = sqrt((vv.x * vv.x) + (vv.z * vv.z)); 
vv = float4(0.0f, dist * dist * -_Curvature , 0.0f, 0.0f); 

vous pouvez également ajouter un DÉCALAGE:

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

EDIT: Je dois mentionner - vous ne pouvez pas faire une sphère du plan. Pour rendre crédible "planète" avec cette méthode, vous devez faire des morceaux et les charger pendant que le joueur sera proche. Même alors, ce ne sera que de l'illusion. Un angle plus grand semblera mauvais aussi.

+0

Merci pour votre réponse, mais je ne suis pas sûr si vous avez lu ma question complètement. Le code que vous m'avez montré est essentiellement ce que j'ai posté comme étant déjà essayé, juste avec l'axe z supplémentaire et un certain décalage. Je ne pense pas que ce soit important, car cela fonctionne assez bien quand ce que j'essaie d'accomplir semble presque impossible. – Jack

+0

Désolé ma faute. Essayez de comprendre la dépendance entre les normales changeantes d'un monde plat à un plan courbe puis tournez par rapport au centre de la "planète" – Krajca