2017-01-07 4 views
2

Хорошо, я новичок в skyboxes, и у меня есть некоторые проблемы, пытаясь достичь облака градиента RADIAL. У меня есть радиальный градиентный шейдер, однако, когда я помещаю это как skybox, часть, которая интерполирует между двумя цветами, слишком сильно масштабируется, а это означает, что вы не можете вообще сказать свой градиент.Как сделать радиальный градиент skybox в Unity?

enter image description here

Я думаю, что это потому, что его Шейдер это еще не означало для скайбоксов. Затем я нашел шейдер для линейного градиента skybox, который работает как линейный градиент, но мне нужно, чтобы он был радиальным, как из центрального цвета наружу.

Ive выглядел повсюду, но не мог найти радиальный градиент SKYBOX-шейдера. Мой вопрос: как можно превратить линейный градиентный шейдер в радиальный для skybox? Или как я могу сделать свой существующий радиальный градиент для skyboxes?

Я не пишу это, но это код для линейного градиента скайбоксе:

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 
     } 
    } 
} 

Как это -

enter image description here

enter image description here

+0

Вы должны объяснить, внешний вид вы собираетесь. Вы хотите, чтобы каждая сторона skybox имела радиальный градиент? Или вы просто хотите небо с одним радиальным градиентом, который всегда находится в одном и том же месте? – Soviut

+0

Непослушный пример в моем вопросе - просто радиальный, который остается в одном и том же месте – skyguy

ответ

1

Указанный шейдерный код делает радиальный градиент только вдоль оси y. Если перевернуть ось, изменяя линию

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

в

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

Edit:

Поскольку вы на самом деле хотите, чтобы повернуть градиент, вы можете сделать следующее в вершинном шейдере (1,57 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:

Полный код:

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

Хорошо, спасибо, но для меня, как и ожидалось, когда я перехожу на x вместо yi, вместо этого получайте вертикальный градиент, а не радиальный (см. Мой вопрос для picture) – skyguy

+0

также что это за параметр угла у вас есть? – skyguy

+0

Ваше представление в 2D режиме? Это заставит его выглядеть линейным градиентом. – Jephron

1

Чтобы создать пример изображения вам не нужно использовать skybox вообще.

  • Создайте плоскость или Quad
  • Добавьте радиальный градиент затенение или текстуру радиального градиента к нему
  • Убедитесь, что все, что шейдер вы используете «неосвещенный»
  • Отключить отбрасывание теней и тень получать информацию о компоненте сетки
  • Перемещения и размера плоскости так, что сидит где вы хотите в сцене
  • Необязательно родителя к камере, или создать «следовать» сценарий, если вы всегда хотите в виде
  • Установите его на другой слой ничьей, чтобы он действовал как skybox и не взаимодействует с уровнями рисования. Остальная часть вашей игры находится на
  • Убедитесь, что слой ничья является самым низким в порядке слоя, так что это всегда ниже всего