2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

URPをいじってシェーダーエラーのピンク悪魔とさよならグッバイ

Last updated at Posted at 2022-01-02

あけましておめでとうございます
年始スタートダッシュ記事です

決して年末に間に合わなかったわけではありません
計画通り です

概要

Unityに関わる人なら誰もが恐れおののくピンク悪魔
RGB値が(255,0,255)なので正確にはマゼンタですがみんなピンクというのでピンクと呼びましょう

ユーザー環境でピンクが出てSNS等で問題になることも多いでしょう
そしてミホノブルボンの勝負服を見るたびにドキッとする人も多いでしょう

これを変更できたら便利じゃないです?
開発環境でわかりやすくしたり、本番ではわかりにくくしたり
URPをイジることで色を変えてみましょう

確認環境

Unity : 2020.3.17f1
URP : 10.6.0

Universal Rendering Pipeline(URP)ってなに?

Unity2019からRendering Piplelineが大きく変更になり
開発者で変更することができるようになりました

Scriptable Rendering Pipeline(SRP)の一般端末向け実装になってます
SRPについては前回の記事を参照ください

URPプロジェクト作成してCustomに変更

URPを選択して新規プロジェクトを作成

これからURPをいじりたいところですが
Package Manager管理下だと自動でロールバックされるので
Packages以下にコピーしてカスタマイズできるようにします

cp -r Library/PackageCache/'com.unity.render-pipelines.core@10.6.0'/ Packages/
cp -r Library/PackageCache/'com.unity.render-pipelines.universal@10.6.0'/ Packages/

URPカスタムテスト

Packages > Universal RP > Runtime > UniversalRenderPipeline.cs
Renderというわかりやすい関数があります
試しに速攻でreturnしてみましょう

protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras)
{
    return;
}
何も映らない.png

なにも映らなくなりました✌
レンダリングで何もせずに終了しているので何も映りません
意図通りの挙動なので元に戻して次に行きます

サンプルシーン

シンプルに用意しました
URPでは既存のStandard Shaderが非対応なのでシェーダーエラーになります
これを利用しましょう

ピンクマゼンダ2.png

みんなのトラウマ
この色を変えていきます

ErrorShaderを作る

Create > Shader > Unlit Shader

やはり目立たないといけないので虹色にしましょう

Unlit/ErrorShader

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 center = fixed3(_ScreenParams.x/2,_ScreenParams.y/2,0);
    			float dist = abs(distance(center, i.vertex) * 2 - _Time.y * 300);
                float temp = dist % 365;
                float red = temp < 45 ? 1 :
                            temp < 135 ? lerp(1, 0, (temp-45)/90) :
                            temp < 225 ? 0 :
                            temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;
                temp = (dist + 121.66) % 365;
                float green = temp < 45 ? 1 :
                            temp < 135 ? lerp(1, 0, (temp-45)/90) :
                            temp < 225 ? 0 :
                            temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;
                temp = (dist + 243.32) % 365;
                float blue = temp < 45 ? 1 :
                            temp < 135 ? lerp(1, 0, (temp-45)/90) :
                            temp < 225 ? 0 :
                            temp < 320 ? lerp(0, 1, (temp-225)/90) : 1;

                return fixed4(red, green, blue, 1);
            }

めっちゃ雰囲気でレインボーシェーダーを作りました

ErrorShaderを変更

URP Packageを「errorMaterial」でgrepかけるとRenderUtil.csがヒットします

Package > Universal RP > Runtime > RenderingUtils.cs

コードを見るととてもそれっぽい部分があります
ここのシェーダーを用意したシェーダーに差し換えてみましょう

        static Material errorMaterial
        {
            get
            {
                if (s_ErrorMaterial == null)
                {
                    // TODO: When importing project, AssetPreviewUpdater::CreatePreviewForAsset will be called multiple times.
                    // This might be in a point that some resources required for the pipeline are not finished importing yet.
                    // Proper fix is to add a fence on asset import.
                    try
                    {
                        // シェーダーでエラーを起こしたら↓↓のマテリアルを使う
                        s_ErrorMaterial = new Material(Shader.Find("Unlit/ErrorShader"));
                        //s_ErrorMaterial = new Material(Shader.Find("Hidden/Universal Render Pipeline/FallbackError"));
                    }
                    catch { }
                }

                return s_ErrorMaterial;
            }
        }

UnityEditorに戻ると自動でリビルドされ反映されます

shader_cloud.gif

目がーーーーーーー!!!!
最高に気持ち悪いビジュアルになりました✌
これでピンク悪魔とさよならグッバイです

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?