Unityで昼夜のサイクル用に2つのライトマップをブレンドするにはどうすればよいですか?


16

他のことを言う前に、デュアルライトマップを使用しています。つまり、近距離と遠距離の両方をブレンドする必要があります。

だから私はしばらくこれに取り組んでいますが、レンダラーと照明用に昼夜サイクル全体を設定していますが、すべてがうまく機能しており、プロセス集約的ではありません。

私が抱えている唯一の問題は、2つのライトマップをどのようにブレンドできるかを考え出すことです。

私はこれについて何時間も研究し、すべての種類のシェーダー、ピクセルごとのブレンド、およびその他すべてを実際に利用することはできませんでした。C#でのピクセルごとのブレンドは、好みに合わせて少し処理が集中することが判明しましたが、クリーンアップとよりスムーズな実行に取り組んでいます。シェーダーは有望に見えましたが、2つのライトマップを適切にブレンドできるシェーダーを見つけることができませんでした。

誰が私がこれを達成できるかについてのリードを持っていますか?昼間のライトマップと夜間のライトマップの間のスムーズな移行が必要です。おそらく、2つのテクスチャをオーバーレイし、アルファチャネルを使用できますか?またはそのような何か?


Proをお持ちの場合、2つのライトマップテクスチャを3番目にレンダリングし、この3番目のテクスチャをライトマップとして使用できますか?これは、ピクセルブレンドと同じようになりますが、非常に高速です。
ネバーマインド

Proがあります。2つのライトマップテクスチャを一緒にレンダリングするにはどうすればよいですか?これが私の主なリードでしたが、私はそれを達成するためのコード/プロセスを把握しようとしています。
ティモシーウィリアムズ

2つのテクスチャをブレンドしたマテリアルを作成し、Graphics.Blit()レンダリングに使用しますか?私はこれをやったことがありませんが、マニュアルを見るとうまくいくはずです。
ネバーマインド

2つのテクスチャを出力にブレンドできる新しいマテリアルを作成し、Afar-1とBfar-1を適用してから、lightmap変数に出力テクスチャを使用しますか?
ティモシーウィリアムズ

ええ、そのようなもの。私はそれをテストしますが、現時点ではProバージョンにアクセスできません。
ネバーマインド

回答:


3

だから私は最近これを試してみましたが、皆さんが抱えているのと同じ多くの問題に遭遇しました。レンダリングテクスチャソリューションは、少し赤いニシンです。別のスレッドでマルチスレッドピクセル操作を使用して解決できました。

https://www.youtube.com/watch?v=T_zpFk1mdCI

そのためgraphics.blit()、通常はレンダリングテクスチャを使用して、必要な場所に渡しますが、ライトマップデータはテクスチャをサポートせず、texture2dsが必要です。次の論理ステップは、データをtexture2dにコピーし、それをライトマップデータにフィードすることです。この手法は、データへの単なる参照ではなく、GPUをストールしてCPUにデータを送信するため、フレームレートを台無しにします。

解決策は、GPUを使用しないことです。

ライトマップの移行は長期間にわたって発生するため、フレームごとにライトマップを更新することは必ずしも重要ではありません。実際問題として、プレイヤーはおそらく、ライトマップがゲーム時間で20〜40分ごとに更新されているかどうかに気付かないでしょう。

そのため、ライトマップごとに個別のスレッドでCPUにタスクを発行します。

通常、Unityはマルチスレッドをサポートしていません。しかし、それは大丈夫、C#はそうです。この男は、Unityでマルチスレッドを説明する驚異的な仕事をしているので、聞いたことがないか、Unityでマルチスレッドする方法を知らなかった場合、これはビデオです:

https://www.youtube.com/watch?v=ja63QO1Imck

必要なのは、Color配列のライトマップピクセルデータのコピーを変更するワーカースレッドクラスを作成し、ブレンド関数を作成することだけです。

ある色から次の色への単純な変化ができます。

次に、スレッドを作成して開始し、すべてのライトマップが個別のスレッドで終了したら、ピクセルデータをコピーしてライトマップデータtexture2dに戻すことができます。

以下にいくつかのサンプルコードを掲載しました。完全に実装されたバージョンではありませんが、クラスの作成、スレッドの作成、およびライトデータの設定の主要な概念を示しています。

他にやらなければならないことは、ライトマップの更新をトリガーするために頻繁に関数を呼び出すことです。また、開始時またはコンパイル時に、すべてのピクセルデータをワーカークラスにコピーする必要があります。これを見つけた人に幸運を。私はopが彼らの人生と共に進んでいると思いますが、私は同様の問題を抱えている他の人々がこれにつまずくかもしれないことを知っています。

public class work
{
    Color[] fromPixels;
    Color[] toPixels;

    public float LerpValue = 0;
    public bool Finished = false;
    public Color[] mixedPixels;

    public work(Color[] FromPix, Color[] ToPix)
    {
        fromPixels= FromPix;
        toPixels= ToPix;
        Finished = false;
        mixedPixels = new Color[FromPix.Length];
    }
    public void DoWork()
    {
        for (int x = 0; x < fromPixels.Length; x++)
        {
            mixedPixels[x] = Color.Lerp(fromPixels[x], toPixels[x], LerpValue);
        }
        Finished = true;
    }
}

IEnumerator LightMapSet()
{
    Thread workerThread = new Thread(someworker.DoWork);
    someworker.LerpValue = lerpValue;
    workerThread.Start();
    yield return new WaitUntil(() => someworker.Finished);
    mixedMap.SetPixels(someworker.mixedPixels);
    mixedMap.Apply(true);
    LightmapData someLightmapData;
    someLightmapData.lightmapColor = mixedMap;
    lightDatas = { someLightmapData};
    LightmapSettings.lightmaps = lightDatas;
}

1

2組のスカイボックステクスチャをブレンドするスカイボックスシェーダーがあります。昼と夜のサイクルを考えてください!

スクリプトからスカイボックスを構築またはアニメーション化する場合は、を使用skyboxmaterial.SetFloat("_Blend", yourBlend)してブレンドを変更します。SetTextureマテリアル関数を使用して、テクスチャをセットアップまたは変更することもできます。

昼/夜サイクルに関するビデオチュートリアル:http : //www.youtube.com/watch?v=FTfv9JhkmIA

サンプルコードは次のとおりです。

Shader "RenderFX/Skybox Blended" {
Properties {
    _Tint ("Tint Color", Color) = (.5, .5, .5, .5)
    _Blend ("Blend", Range(0.0,1.0)) = 0.5
    _FrontTex ("Front (+Z)", 2D) = "white" {}
    _BackTex ("Back (-Z)", 2D) = "white" {}
    _LeftTex ("Left (+X)", 2D) = "white" {}
    _RightTex ("Right (-X)", 2D) = "white" {}
    _UpTex ("Up (+Y)", 2D) = "white" {}
    _DownTex ("Down (-Y)", 2D) = "white" {}
    _FrontTex2("2 Front (+Z)", 2D) = "white" {}
    _BackTex2("2 Back (-Z)", 2D) = "white" {}
    _LeftTex2("2 Left (+X)", 2D) = "white" {}
    _RightTex2("2 Right (-X)", 2D) = "white" {}
    _UpTex2("2 Up (+Y)", 2D) = "white" {}
    _DownTex2("2 Down (-Y)", 2D) = "white" {}
}

SubShader {
    Tags { "Queue" = "Background" }
    Cull Off
    Fog { Mode Off }
    Lighting Off        
    Color [_Tint]
    Pass {
        SetTexture [_FrontTex] { combine texture }
        SetTexture [_FrontTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_FrontTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_BackTex] { combine texture }
        SetTexture [_BackTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_BackTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_LeftTex] { combine texture }
        SetTexture [_LeftTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_LeftTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_RightTex] { combine texture }
        SetTexture [_RightTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_RightTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_UpTex] { combine texture }
        SetTexture [_UpTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_UpTex2] { combine previous +- primary, previous * primary }
    }
    Pass {
        SetTexture [_DownTex] { combine texture }
        SetTexture [_DownTex2] { constantColor (0,0,0,[_Blend]) combine texture lerp(constant) previous }
        SetTexture [_DownTex2] { combine previous +- primary, previous * primary }
    }
}

Fallback "RenderFX/Skybox", 1
}

2
質問は、スカイボックスではなく、ライトマップについて尋ねました。リンクのおかげで、これは私にとって有用であるように見えます。
ジョッキング

0

切り替える方法がわかっている場合は、バックグラウンドスレッドで多数のトランジションライトマップを作成し、ライトマップの準備ができたらトランジションを有効にしてください。

AssetStoreで興味深いアセットを見ることができますhttps ://www.assetstore.unity3d.com/en/#!/content/5674

方法はわかりませんが、ライトマップブレンドが含まれていると思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.