2017-01-07 7 views
2

Ok, je suis nouveau à skyboxes et j'ai quelques problèmes en essayant d'obtenir une skybox gradient RADIAL. J'ai un dégradé de dégradé radial, mais quand je mets ça comme skybox, la partie qui interpole entre les deux couleurs est trop agrandie, ce qui veut dire que vous ne pouvez pas vraiment lui donner un dégradé.Comment faire un skybox gradient radial dans Unity?

enter image description here

Je pense que cela est parce que son thats shaders pas destinés à skyboxes. J'ai alors trouvé un shader pour un skybox à gradient linéaire qui fonctionne comme un dégradé linéaire, mais j'ai besoin qu'il soit radial, comme de la couleur du centre vers l'extérieur. J'ai regardé partout mais je ne peux pas trouver un dégradé radial SKYBOX shader. Ma question est - comment peut-on transformer un shader gradient linéaire en radial pour skybox? Ou comment puis-je faire fonctionner mon dégradé radial existant pour les skybox?

Je n'ai pas écrit, mais c'est le code pour le gradient linéaire skybox:

Shader "Custom/Horizontal Skybox" 
{ 
    Properties 
    { 
     _Color1 ("Top Color", Color) = (1, 1, 1, 0) 
     _Color2 ("Horizon Color", Color) = (1, 1, 1, 0) 
     _Color3 ("Bottom Color", Color) = (1, 1, 1, 0) 
     _Exponent1 ("Exponent Factor for Top Half", Float) = 1.0 
     _Exponent2 ("Exponent Factor for Bottom Half", Float) = 1.0 
     _Intensity ("Intensity Amplifier", Float) = 1.0 
    } 

    CGINCLUDE 

    #include "UnityCG.cginc" 

    struct appdata 
    { 
     float4 position : POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    struct v2f 
    { 
     float4 position : SV_POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    half4 _Color1; 
    half4 _Color2; 
    half4 _Color3; 
    half _Intensity; 
    half _Exponent1; 
    half _Exponent2; 

    v2f vert (appdata v) 
    { 
     v2f o; 
     o.position = mul (UNITY_MATRIX_MVP, v.position); 
     o.texcoord = v.texcoord; 
     return o; 
    } 

    half4 frag (v2f i) : COLOR 
    { 
     float p = normalize (i.texcoord).y; 
     float p1 = 1.0f - pow (min (1.0f, 1.0f - p), _Exponent1); 
     float p3 = 1.0f - pow (min (1.0f, 1.0f + p), _Exponent2); 
     float p2 = 1.0f - p1 - p3; 
     return (_Color1 * p1 + _Color2 * p2 + _Color3 * p3) * _Intensity; 
    } 

    ENDCG 

    SubShader 
    { 
     Tags { "RenderType"="Background" "Queue"="Background" } 
     Pass 
     { 
      ZWrite Off 
      Cull Off 
      Fog { Mode Off } 
      CGPROGRAM 
      #pragma fragmentoption ARB_precision_hint_fastest 
      #pragma vertex vert 
      #pragma fragment frag 
      ENDCG 
     } 
    } 
} 

Vous aimez cette -

enter image description here

enter image description here

+0

Vous devez expliquer le look que vous allez pour. Voulez-vous que chaque côté de la skybox ait un dégradé radial? Ou voulez-vous juste un ciel avec un seul gradient radial qui est toujours au même endroit? – Soviut

+0

Ill sur un exemple dans ma question - juste un radial qui reste au même endroit – skyguy

Répondre

1

Le code shader que vous avez fourni dessine un dégradé radial, uniquement le long de l'axe y. Si vous retournez l'axe en changeant la ligne

float p = normalize (i.texcoord).y; 

à

float p = normalize (i.texcoord).x; 

Edit:

Puisque vous voulez réellement faire tourner le gradient, vous pouvez faire ce qui suit dans le vertex shader (1,57 est pi/2).

v2f vert (appdata v) 
{ 
    v2f o; 
    float sinX = sin (1.57); 
    float cosX = cos (1.57); 
    float sinY = sin (1.57); 
    float2x2 rotationMatrix = float2x2(cosX, -sinX, sinY, cosX); 
    o.position = mul (UNITY_MATRIX_MVP, v.position); 
    o.texcoord.xz = mul(v.texcoord.xz, rotationMatrix); 
    o.texcoord.y = v.texcoord.y; 
    return o; 
} 

Edit 2:

Code complet:

Shader "Custom/Horizontal Skybox" 
{ 
    Properties 
    { 
     _Color1 ("Top Color", Color) = (1, 1, 1, 0) 
     _Color2 ("Horizon Color", Color) = (1, 1, 1, 0) 
     _Color3 ("Bottom Color", Color) = (1, 1, 1, 0) 
     _Exponent1 ("Exponent Factor for Top Half", Float) = 1.0 
     _Exponent2 ("Exponent Factor for Bottom Half", Float) = 1.0 
     _Intensity ("Intensity Amplifier", Float) = 1.0 
     _Angle ("Angle", Float) = 0.0 
    } 

    CGINCLUDE 

    #include "UnityCG.cginc" 

    struct appdata 
    { 
     float4 position : POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    struct v2f 
    { 
     float4 position : SV_POSITION; 
     float3 texcoord : TEXCOORD0; 
    }; 

    half4 _Color1; 
    half4 _Color2; 
    half4 _Color3; 
    half _Intensity; 
    half _Exponent1; 
    half _Exponent2; 
    half _Angle; 

    v2f vert (appdata v) 
    { 
     v2f o; 
     float sinX = sin (_Angle); 
     float cosX = cos (_Angle); 
     float sinY = sin (_Angle); 
     float2x2 rotationMatrix = float2x2(cosX, -sinX, sinY, cosX); 
     o.position = mul (UNITY_MATRIX_MVP, v.position); 
     o.texcoord.xz = mul(v.texcoord.xz, rotationMatrix); 
     o.texcoord.y = v.texcoord.y; 
     return o; 
    } 

    half4 frag (v2f i) : COLOR 
    { 
     float p = normalize (i.texcoord).x; 
     float p1 = 1.0f - pow (min (1.0f, 1.0f - p), _Exponent1); 
     float p3 = 1.0f - pow (min (1.0f, 1.0f + p), _Exponent2); 
     float p2 = 1.0f - p1 - p3; 
     return (_Color1 * p1 + _Color2 * p2 + _Color3 * p3) * _Intensity; 
    } 

    ENDCG 

    SubShader 
    { 
     Tags { "RenderType"="Background" "Queue"="Background" } 
     Pass 
     { 
      ZWrite Off 
      Cull Off 
      Fog { Mode Off } 
      CGPROGRAM 
      #pragma fragmentoption ARB_precision_hint_fastest 
      #pragma vertex vert 
      #pragma fragment frag 
      ENDCG 
     } 
    } 
} 
+0

Ok, merci mais pour moi, comme prévu quand je change en x au lieu de yi juste obtenir un gradient vertical à la place, pas radial (voir ma question pour image) – skyguy

+0

aussi quel est ce paramètre d'angle que vous avez? – skyguy

+0

Votre vue est-elle en mode 2D? Cela ferait apparaître un dégradé linéaire. – Jephron

1

Pour créer l'image par exemple vous n'avez pas besoin d'utiliser une skybox du tout.

  • Créer un plan plat ou Quad
  • Ajouter un shader dégradé radial ou une texture d'un dégradé radial à elle
  • Assurez-vous que tout shaders que vous utilisez est « éteint »
  • ombre Désactiver la coulée et l'ombre recevoir sur le composant de maille
  • Déplacer et dimensionner le plan de sorte qu'il se trouve là où vous voulez dans la scène
  • parent option à l'appareil photo, ou de créer un script « suivre », si vous voulez toujours en vue
  • Définissez-le sur un calque de dessin différent afin qu'il agisse comme un skybox et n'interagisse pas avec les calques. Le reste de votre jeu est activé
  • Assurez-vous que le calque de dessin est le plus bas dans l'ordre des calques. toujours en dessous de tout