2017-01-07 2 views
2

좋아, 나는 스카이 박스를 처음 사용하고 RADIAL 그라디언트 스카이 박스를 만들기 위해 몇 가지 문제를 겪고있다. 방사형 그래디언트 쉐이더가 있는데, 스카이 박스로 넣을 때 두 색상을 보간하는 부분이 너무 확대되어있어 실제로는 그레디언트를 전혀 말할 수 없습니다.Unity에서 방사형 그래디언트 스카이 박스 만드는 법은 무엇입니까?

enter image description here

나는 그 셰이더 그게 전부는 스카이 박스에 대한 의미하지 때문이라고 생각합니다. 그런 다음 선형 그래디언트로 작동하는 선형 그래디언트 스카이 박스의 쉐이더를 찾았지 만 중심 색상 바깥 쪽과 같이 방사형이되어야합니다.

Ive는 도처에서 보았지만 방사형 그라디언트 SKYBOX 셰이더를 찾을 수 없습니다. 내 질문은 - 어떻게 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 
     } 
    } 
} 

-

enter image description here

enter image description here

+0

당신은 당신이 가고있는 모습을 설명 할 필요가있다. 스카이 박스의 각면에 방사형 그래디언트를 적용 하시겠습니까? 아니면 항상 동일한 장소에있는 단일 방사형 그래디언트가있는 하늘을 원하십니까? – Soviut

+0

내 질문에 - 예를 들어, 그냥 같은 장소에 유지 방사형 – skyguy

답변

1

제공 한 셰이더 코드는 y 축을 따라 방사형 그래디언트를 그립니다. 당신이 라인을 변경하여 축 플립 경우

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

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

에 편집 : 실제로 그라데이션을 회전 할 때문에

, 당신은 (1.57을 정점 셰이더에서 다음을 수행 할 수 있습니다 π/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; 
} 

편집 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

좋아, 고맙지 만하지만, 내가 대신이 기울기 대신 수직 그라디언트를 얻으려고 yi 대신 x로 변경하면 예상대로 내 질문을 참조하십시오 그림) – skyguy

+0

또한 당신은 그 각도 매개 변수가 무엇입니까? – skyguy

+0

보기가 2D 모드입니까? 그러면 선형 그래디언트로 보일 것입니다. – Jephron

1

는 예를 들어 이미지를 만들려면 skybox를 전혀 사용할 필요가 없습니다.

  • 은 사용 있는지 어떤 쉐이더 확인 방사형 그라디언트 쉐이더 나에 방사형 그라디언트의 질감을 추가 평평한 평면 또는 쿼드
  • 만들기 "꺼져"
  • 안 그림자 캐스팅과 그림자 메쉬 구성 요소 수신
  • 장면에서 원하는 위치에 놓 이도록 비행기 이동 및 크기 조절
  • 카메라에 항상 부모를 지정하거나 항상 볼 수있는 경우 "follow"스크립트를 만듭니다.
  • 다른 드로우 레이어에서 설정하여 스카이 박스처럼 동작하고 게임의 나머지 부분에있는 그리기 레이어와 상호 작용하지 않음
  • 그리기 레이어가 레이어 순서에서 가장 낮아서 항상 모든 것의 아래에 있습니다
관련 문제