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

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

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

# 概要
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については前回の記事を参照ください

https://qiita.com/tsune2ne/items/7e52ba8b15f965042359

# URPプロジェクト作成してCustomに変更
URPを選択して新規プロジェクトを作成

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

```shell
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してみましょう

```c# 
protected override void Render(ScriptableRenderContext renderContext, Camera[] cameras)
{
    return;
}
```

<img width="600" alt="何も映らない.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/cd3cc2c5-05f1-0908-75f3-04d42e98f9a8.png">

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

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

<img width="600" alt="ピンクマゼンダ2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/f598a614-7811-05f9-89c2-02a89d2d9e4b.png">

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


# ErrorShaderを作る
Create > Shader > Unlit Shader

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

### Unlit/ErrorShader

```c#
            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

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

```c#
        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に戻ると自動でリビルドされ反映されます

<img width="600" alt="shader_cloud.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7680/f5a218e8-d0db-58f8-610d-f986597dbc56.gif">


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



# 参考

https://tsubakit1.hateblo.jp/entry/2018/08/16/221016

https://catlikecoding.com/unity/tutorials/custom-srp/custom-render-pipeline/