Notifications
Article
LightWeightRenderPipeline向けにShaderを書いてみた
Updated 5 months ago
734
4
LightWeightRenderPipeline向けにShaderを書いてみた

LightWeightRenderPipeline(以下LWRPと略します)について

LWRPは Unityが提供しているモバイル向けに作成された ScriptableRenderPipeline になります。
Package Managerより Installすることで、プロジェクトに取り込むことが出来ます。
また、こちらのgithubリポジトリには PackageManagerよりも新しいバージョンがあります。最新版については、ここで確認が出来ます。
詳しい説明は、githubリポジトリ上のReadMeにお任せします。 「既存の描画パイプラインとの違い」なんかも上記のReadMeからリンクされているので、コチラを一通り見ると良いでしょう。

LWRP向けにShaderを書いてみた話

※前提として、1.1.8-preview向けでの話になります。
前の記事でも書いたようにScriptableRenderPipelineでは SurfaceShaderは使えません。 LWRP向けのShaderを書く場合は、vertex / fragment shaderを直接書く形となります。
基本的には、Shader内のPassに Tags { "LightMode" = "LightweightForward"} と書くだけで済みます。 ただし、これだけでは済まないケースが出てきます。 それは…。 Receive Shadowして影を描画する Shaderの時です!

という事で影を描画するshaderをLWRPで書くのに苦労した記事です!

何故ダメなのか? それは ScreenSpaceShadowMapのTextureが来る Shaderパラメーター名が、既存のRenderpipelineと LightWeightで異なるからです!!!
既存のRenderPipeline だと「_ShadowMapTexture」という名前で ShadowMapのテクスチャが来るのですが… LWRPだと「_ScreenSpaceShadowMap」という名前に変わってしまっています!!! これが原因で ShadowMapTextureが適応されずに、描画されなくなってしまいます…
※1.何も悪い事ばかりではありません… 既存のRenderPipeline だとRGBA32のフォーマットでScreenSpaceShadowMapは生成されていましたが、LightWeightだと R8フォーマットになっています。
※2.github上のソース見てたら、最新版でまた名前変わっている可能性がありそうでした…

既存Pipelineの vertex/fragment shaderで影の描画をする方法について

Unityのマニュアルにある「Receiving shadows」の部分に実装のサンプルと詳細がありますが、要点だけ説明しますと、Shaderに対して下記対応を行うことで影の描画に対応する形になります
  1. #include "AutoLight.cginc"をします
  2. struct v2f に SHADOW_COORDS(1) のような感じで、vertex shaderからfragment shaderに渡すパラメーターに影用のパラメーターを追加します
  3. vertex shaderに 影用の計算処理を TRANSFER_SHADOW(o); という形で追加します
  4. fragment shader に SHADOW_ATTENUATION(i); を追加して影の具合を取得します

LightWeightRenderPipelineでの影描画方法の話に戻ります

「きっと、LWRPの中に便利な .cginc ファイルがあって、それを使えば簡単に対応できる…。」 そう思っていた時期が私にもありました…。 LWRPのShaderが大体HLSLで書かれており、自分で書くのは GLSLだったんですよね…。 なので、その線はあきらめました
代わりに 下記のようにしました
  1. Unityのビルトインされている "AutoLighting.cginc" の代わりとなる簡易版の "CustomAutoLighing.cginc" を作成します
  2. 対象Shaderの 「#include "AutoLighting.cginc" 」を「 #include "CustomAutoLighting.cginc」に変更します
という事で、サンプルはコチラに置いておきますね。 ただ、十分にテストしておらず影が出て満足したレベルですのでご了承ください~。
※余談で他にはまったこととして… 「CasterShadow」Passが LWRPから持ってこないと、なんかZファイティングっぽい感じで変に影が出てきたりとかありました…

という事で、LightWeightRenderPipelineで影を描くShaderの話でしたーー。


YusukeKurokawa (黒河 優介)
Developer Relation Manager/Engineer - Programmer
5
Comments
Developer Relation Manager/Engineer - Programmer
tamtamそれにしても非常によい人柱記事だったw 自分もLWRPでシェーダー作るときは、まずこの記事から見ようっと
Shader Graph Toolだとこういう事なさそうな感じしますがー。 あとでちょっと見てみますー
1
Developer Relation Manager/Engineer - Programmer
tamtam「frament shader」「Recieve Shadow」とタイポしている箇所がありましたー
ありがとうございますー。修正しましたー
1
tamtam
Staff
5 months ago
Community Evangelist - Marketer
それにしても非常によい人柱記事だったw 自分もLWRPでシェーダー作るときは、まずこの記事から見ようっと
0
tamtam
Staff
5 months ago
Community Evangelist - Marketer
「frament shader」「Recieve Shadow」とタイポしている箇所がありましたー
0