3

OK、私はスカイボックスが初めてで、RADIALグラデーションスカイボックスを実現しようとしていくつかの問題を抱えています. 私は放射状グラデーション シェーダーを持っていますが、これをスカイボックスとして配置すると、2 つの色の間を補間する部分が拡大されすぎて、グラデーションとはまったくわかりません。

ここに画像の説明を入力

これは、スカイボックス向けではないシェーダーだからだと思います。次に、線形グラデーションとして機能する線形グラデーション スカイボックスのシェーダーを見つけましたが、中心の色から外側に向かって放射状にする必要があります。

私はどこでも見ましたが、放射状のグラデーション 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
        }
    } 
}

このような -

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

2

サンプル画像を作成するために、スカイボックスをまったく使用する必要はありません。

  • フラット プレーンまたはクワッドを作成する
  • 放射状グラデーション シェーダーまたは放射状グラデーションのテクスチャを追加します。
  • 使用するシェーダーが「照明なし」であることを確認してください
  • メッシュ コンポーネントで影のキャスティングと影の受信を無効にする
  • 平面を移動してサイズを調整し、シーン内の好きな場所に配置します
  • 必要に応じてカメラの親にするか、常に表示したい場合は「フォロー」スクリプトを作成します
  • 別の描画レイヤーに設定して、スカイボックスのように機能し、ゲームの残りの描画レイヤーと相互作用しないようにします
  • 描画レイヤーがレイヤー順序で最下位であることを確認して、常にすべての下にあるようにします
于 2017-01-07T23:10:59.910 に答える
1

あなたが提供したシェーダー コードは、y 軸に沿ってのみ、放射状のグラデーションを描画します。線を変えて軸を反転させると

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

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

編集:

実際にはグラデーションを回転させたいので、頂点シェーダーで次のことができます (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;
}

編集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
        }
    }
}
于 2017-01-07T23:31:56.200 に答える