- プロジェクトの目標
2Dスプライトに影を付けるシェーダーを作成する。
Unityの Universal Render Pipeline (URP) を使用して、スプライトにリアルタイムライティングと影の効果を適用。
参考にした動画:
https://www.youtube.com/watch?v=flu2PNRUAso
- カスタムシェーダー制作開始
作業内容
Unityプロジェクトにて Create > Shader > Unlit Shader を選択し、新しいシェーダーファイルを作成。
シェーダーファイルの名前を SpriteShader に変更。
目的: スプライトにリアルタイムライティングと影を適用できるカスタムシェーダーを実装すること。
2. 初期シェーダーコード記述と設定
作業内容
影とライティングに対応する以下のカスタムシェーダーコードを記述:
ShadowCaster パス: 影生成用。
ForwardLit パス: ライティングとテクスチャの描画用。
書いたコードをシェーダーファイルに適用し、マテリアルに設定。
発生エラー1: SAMPLE_TEXTURE2D の引数不足
エラー内容:
'SAMPLE_TEXTURE2D': Too few arguments to a macro call. というエラーが、ShadowCaster パスと ForwardLit パスの両方で発生。
原因: SAMPLE_TEXTURE2D マクロの引数に不足があった。
解決方法:
SAMPLE_TEXTURE2D マクロを以下のように修正:
SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
必要な3つの引数(テクスチャ、サンプラー、UV座標)を正しく指定。
発生エラー2: TransformObjectToHClip の型変換警告
警告内容:
implicit truncation of vector type というWarningが発生。
原因: TransformObjectToHClip の出力型が float3 ではなく float4 であるため。
解決方法:
型変換を正確に指定:
OUT.positionHCS = TransformObjectToHClip(float4(IN.positionOS.xyz, 1.0));
必要な w 成分を追加して、型を float4 に統一。
- HDRP関連のエラー発生
エラーの詳細
エラー内容: 'GetInverseCurrentExposureMultiplier': undeclared identifier。
原因:
Unityプロジェクトが Universal Render Pipeline (URP) を使用しているにもかかわらず、HDRP関連のシェーダーコードが含まれていた。
HDRP専用のシェーダーノードや関数がプロジェクトに影響を与えていた。
解決方法:
HDRPパッケージの削除:
Unityの Package Manager を開き、High Definition RP パッケージを削除。
プロジェクトディレクトリの Library/PackageCache を削除してUnityを再起動。
URPアセットの確認:
プロジェクト設定 (Project Settings > Graphics) で、Default Render Pipeline Asset がURPアセットに設定されていることを確認。
5. シェーダーの再テストと最終修正
テスト内容
シーン内のスプライトオブジェクトにカスタムシェーダーを適用。
確認ポイント:
スプライトに影が適切に付くか。
ライティングの影響を受けて明暗が変化するか。
結果
シェーダーが期待通り動作。
HDRP関連のエラー・警告はすべて解消。
最終的にURP環境で影付きスプライトが正常に描画。
まとめ
作業: カスタムシェーダー作成、エラー修正、HDRP削除。
発生エラー:
SAMPLE_TEXTURE2D 引数不足。
型変換警告。
HDRP専用関数未定義エラー。
解決方法: 正しいシェーダーコードへの修正と、HDRPパッケージの削除。