ホーム
ゲーム開発
Unity
UnrealEngine
C++
ゲーム数学
ゲームAI
サウンド
アニメーション
GBDK
制作日記
3DCG
Houdini
Blender
USD
グラフィックス
テクノロジ
生成AI関連
動画制作
ツール開発
フロントエンド関連
サーバサイド関連
ソフトウェア設計
ハードウェア関連
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
その他
ブログについて
都会のエレキベア
ラーメン日記
四コマ漫画
おすすめアイテム
おもしろコラム
お問い合わせ
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • ゲーム数学
    • ゲームAI
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • 3DCG
    • Houdini
    • Blender
    • USD
    • グラフィックス
  • テクノロジ
    • 生成AI関連
    • 動画制作
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • ソフトウェア設計
    • ハードウェア関連
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • その他
JP|EN
  1. ホーム
  2. 20230214_02

【Unity】URPでシェーダー実装した際に発生した不具合と対処方法まとめ

Unityグラフィックスシェーダー
2023-02-13

マイケル
マイケル
みなさんこんにちは!
マイケルです!!
エレキベア
エレキベア
こんにちクマ〜〜〜
マイケル
マイケル
今回は最近リリースした「怪盗チョコレート」を開発する中で発生した、
シェーダー描画周りの不具合と対処内容について紹介しようと思います!

怪盗チョコレート – 3Dチョコ集めアクション –
MOLEGORO 無料
チョコを集めて育成する3D怪盗ゲーム

エレキベア
エレキベア
確かURPを使用したらいろいろ対処しないといけないことがあったのクマね
マイケル
マイケル
うん、今回は下記のバージョンを使用していて、URP環境でシェーダー実装した際の不具合対処の内容になるよ!
バージョンや環境によって差異がある可能性もあるから、その辺りはご注意ください!
[使用したバージョン]

Unity 2021.3.1f1 (URP)
マイケル
マイケル
また、スクリプトについてもGitHubにて公開しています!
シェーダー周りはShaderフォルダ内に格納してありますので、こちらもよければ一緒にご参照ください!

GitHub – masarito617 / unity-chocolate-thief-scripts

エレキベア
エレキベア
同じような不具合が発生した場合にはぜひ参考いただきたいクマ〜〜〜

発生した不具合と対処内容

マイケル
マイケル
それでは早速本題に入っていきますが、発生した不具合は
・マルチパス描画されない
・ShaderGraphで作成した際、SpriteUnlitが透過しない
・一部端末でSpriteが描画されない
の3点になります。

マルチパス描画されない

マイケル
マイケル
一点目の「マルチパス描画されない」件に関しては、下記のトゥーンシェーダー実装時に発生しました。
マイケル
マイケル
こちらは輪郭線部分とそれ以外でパスを分けて実装していたのですが、
ビルトインで作成したものをそのまま持ってきた場合に、一つ目のパスしか描画されないという状態になりました。
↑一つ目のパスしか描画されていない
エレキベア
エレキベア
これは輪郭線部分(背面)しか描画されていないということクマね・・・
対処:UniversalForwardを指定する
マイケル
マイケル
こちらの対処については下記記事を参考にさせていただきました!
片方のパスに「”LightMode” = “UniversalForward”」を指定することで無事マルチパス描画されるようになりました。

参考:
Unity URP環境でMultiPassのシェーダーを描く

・・・略・・・
        // 背面
        Pass
        {
            Tags{ "LightMode" = "UniversalForward"} // URPでマルチパス描画するのに必要
            Cull Front
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
・・・略・・・
↑「UniversalForward」を指定
マイケル
マイケル
このようにURPではレンダリングの仕組みが変わっていることがあるため、ビルトインで作ったシェーダーを移行する際には注意しましょう!
他に指定できるタグの種類としては下記のようなものがあるようです。

URP ShaderLab Pass tags | Universal RP | 10.1.0

エレキベア
エレキベア
どちらのパスもデフォルトの「SRPDefaultUnlit」になっていたから
描画されてなかったわけクマね

ShaderGraphで作成した際、SpriteUnlitが透過しない

マイケル
マイケル
次に発生したのは「ShaderGraphで作成した際、SpriteUnlitが透過しない」という問題です。
こちらは下記記事を参考にShaderGraphで集中線エフェクトを実装した際に発生しました。

参考:
集中線エフェクト【uGUI】|Unity ShaderGraph CookBook vol.1【ShaderGraph 入門】

↑集中線シェーダー
↑ShaderGraphで実装した
マイケル
マイケル
URPでOnRenderImageが使用できない関係もあり今回はuGUIのSpriteにマテリアルを設定したのですが、下記のようにGameViewで透過せず真っ黒になるという事象が発生しました。
↑SceneViewでは問題なさそうだが…
↑GameViewで透過していない
エレキベア
エレキベア
むむむ・・・何故クマ・・・
対処:コードを生成して不要パスを削除
マイケル
マイケル
こちらの件について調査したところ、下記のUnity Forumにて類似の事象がありました。
どうやらUnity2021で発生している不具合のようで、2022年2月現在まだ解決はしていないようです。

Bug – Shader Graph UI Image Shader does not work – Unity Forum

エレキベア
エレキベア
おおぅ・・・・Unity起因クマか・・・
マイケル
マイケル
こちらはUnityForum内で記載されている暫定的な解決案を参考に、
1. View Generated Shader からシェーダーコードを出力する
2. 出力されたコード内の不要なパスを削除する

といった手順を踏むことで正常に描画されるようになりました!
↑コードを生成する
・・・略・・・
            // このパスと...
            Pass
            {
                Name "SceneSelectionPass"
                Tags
                {
                    "LightMode" = "SceneSelectionPass"
                }
・・・略・・・
            // このパスを丸ごと削除!!
            Pass
            {
                Name "ScenePickingPass"
                Tags
                {
                    "LightMode" = "Picking"
                }
・・・略・・・
↑Unity2021で追加されたパス「SceneSelectionPass」「ScenePickingPass」を丸ごと削除
エレキベア
エレキベア
追加されたパスが悪さしていたクマね
強行手段クマ・・・

一部端末(iPad?)でSpriteが描画されない

マイケル
マイケル
最後に発生したのは「一部端末(iPad?)でSpriteが描画されない」という不具合です。
こちらは先ほどの集中線エフェクトに加え、下記の背景シェーダーでも発生しました。
↑背景ボーダーシェーダー

参考:
そろそろShaderをやるパート12 線を描画してスクロールさせる

エレキベア
エレキベア
また面倒くさそうな不具合クマ・・・
マイケル
マイケル
こちらがOSバージョン起因なのか機種起因なのかまでは特定できていないのですが、
少なくとも自分の手持ちのiPhoneXでは発生せず、iPadでのみ不具合が発生するといった状態でした。
↑iPadだけ何故か描画されない
エレキベア
エレキベア
おおぅ・・・・
マイケル
マイケル
開発終盤で発生したので、これは正直焦りましたね〜〜
対処:ZTest Alwaysを指定する
マイケル
マイケル
こちらは新規作成したURPシェーダーの内容と差異がないかを比較してみて、
最終的には「ZTest Always」を指定することで解決することができました。
// タイトル画面の背景シェーダー
Shader "Hidden/TitleScrollShader"
{
Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color1("Color 1",Color) = (0,0,0,1)
        _Color2("Color 2",Color) = (1,1,1,1)
    }
    SubShader
    {
        // bugfix: これ付けないとiPadで表示されなかった
        Cull Off ZWrite Off ZTest Always
        Tags
        {
            "RenderType"="Opaque"
        }
・・・略・・・
↑背景シェーダーの修正
・・・略・・・
            Pass
            {
                Name "Sprite Unlit"
                Tags
                {
                    "LightMode" = "Universal2D"
                }
                // Render State
                Cull Off
                Blend SrcAlpha OneMinusSrcAlpha, One OneMinusSrcAlpha
                ZTest Always // bugfix: AlwaysにしないとiPadで表示されなかった
                ZWrite Off
・・・略・・・
↑集中線エフェクトの修正
エレキベア
エレキベア
これは中々気づきにくいクマね〜〜〜
マイケル
マイケル
正直詳細な原因までは調べきれていないのですが、何らかの原因でZTestに合格できずに描画されていなかったかと思われますね・・・。
機種やOSバージョンによってもこの辺りの差異があるのでしょうか・・?
エレキベア
エレキベア
なんにせよSpriteが場合にはZTest周りの指定を疑ってみてもいいかもしれないクマね

おわりに

マイケル
マイケル
というわけで今回はURPでシェーダー実装した際の不具合対処でした!
どうだったかな??
エレキベア
エレキベア
やっぱりいざ描画周りをいじろうとするといろいろ起きるクマね〜〜
何にせよ今回は解決してよかったクマ
マイケル
マイケル
開発に時間が限られてたから、ハマってたらやばかったかもね!
こればっかりは経験が物を言いそうなので地道にやっていこう!
エレキベア
エレキベア
まあいい勉強にはなったクマ
マイケル
マイケル
それでは今日はこの辺で!
アデューーー!!
エレキベア
エレキベア
クマ〜〜〜〜〜〜

【Unity】URPでシェーダー実装した際に発生した不具合と対処方法まとめ 〜完〜


Unityグラフィックスシェーダー
2023-02-13
記事をSNSで共有する
X
Facebook
LINE
はてなブックマーク
Pocket
LinkedIn
Reddit

著者の各種アカウント
フォローいただけると大変励みになります!

関連記事
【Unity】Light2DとTimelineを活用した2Dライブシーンの構築
2026-07-20
【Three.js】カスタムシェーダーでトゥーン+背面法アウトラインを実装する
2026-02-15
【Three.js】Three.js入門 - シーン構築・モデル読み込み・ポストプロセスまで
2026-02-15
【Houdini21.0】3Dビル群っぽいブログヘッダー画像を作成する
2026-01-10
【Houdini21.0】Solaris徹底入門:USD構成を意識した基本的な作業フローについてまとめる
2025-12-31
【ゲーム数学】第十回 p5.js(+α)で学ぶゲーム数学「複素数とフラクタル」
2025-11-02
【プロシージャル】Pythonで学ぶ波動関数崩壊アルゴリズム(Wave Function Collapse)
2025-06-22
【UE5.5】Nanite、Lumen、VSMの概要についてまとめる
2025-05-12