ShaderLab

  • サーフェスシェーダー
  • 頂点シェーダー/フラグメントシェーダー
  • 固定関数シェーダー

公式サイト:

ShaderLab | Unity マニュアル [公式]

概要

参考:

シェーダーについて自分なりにまとめてみた – Speaker Deck

シェーダを書けるプログラマになろう – SlideShare

導入

ドキュメント:

シェーダーを書く | Unity 2019.4 マニュアル [公式]

参考:

Shader の書き方 – Qiita

ランバート反射/フォン反射/フレネル効果を Unity で実装した話 – Qiita

Lambert 拡散反射シェーダーを作る | 3DCG school

シェーダで遊んでみよう | おもちゃラボ

20行から始めるミニマルシェーダ | おもちゃラボ

Shader を勉強する – Qiita

Shader の勉強 #1 – Qiita

Shader の勉強 #2 – Qiita

Shader の勉強 #3 – Qiita

Shader の勉強 #4 – Qiita

Shader の勉強 #5 – Qiita

使い方

参考:

シェーダ入門 | コガネブログ

シェーダースクリプトについて | かめくめ

シェーダの基礎を勉強してみたのでやる気出してまとめてみた | 凹みTips

Shader の勉強 #1 – Qiita

シェーダーによる色の変更、発光、光沢を持たせない設定 | @IT

シェーダーを書いてみよう! ShaderLab の簡単な書き方! | 侍エンジニア塾ブログ

入門

参考:

入門 #1 Shader の書き方 – Qiita

Unlit Shader の要素を全て解説 | アマガミナブログ

7日間でマスターする Unity シェーダ入門 | おもちゃラボ

視聴:

Unity シェーダープログラム入門 (AMAGAMI) – YouTube

書き方

こちらのページを参照

ドキュメント:

ShaderLab シンタックス | Unity 2019.4 マニュアル [公式]

ShaderLab と固定関数シェーダー – チュートリアル | Unity 2019.4 マニュアル [公式]

サーフェスシェーダーの記述 | Unity マニュアル [公式]

Unity で使用するシェーダー言語 | Unity 2018.4 マニュアル [公式]

参考:

シェーダの基礎を勉強してみたのでやる気出してまとめてみた | 凹みTips

ShaderLab ノート – Qiita

Surface シェーダーとフラグメントシェーダーの違いを軽くまとめてみた – Qiita

サーフェスシェーダー

照明あるいは影による影響を考慮してメッシュを描画する。Cg/HLSL で記述する。フォワードレンダリングあるいはディファードレンダリングをサポートする。サーフェスシェーダーは内部的に頂点シェーダー/フラグメントシェーダーに変換される。

こちらのページを参照

ドキュメント:

サーフェスシェーダーの記述 | Unity マニュアル [公式]

参考:

Surface Shader 入門 – Qiita

頂点シェーダー/フラグメントシェーダー

ライティングを必要としない場合に用いる。あるいは、頂点の情報をダイレクトに扱う低レベルシェーダーを作成する場合にも用いる。Cg/HLSL で記述する。照明あるいは影を扱う場合はサーフェスシェーダーの方が向いている。

こちらのページを参照

ドキュメント:

頂点シェーダーとフラグメントシェーダーの記述 | Unity 2019.4 マニュアル [公式]

カスタムシェーダーの基礎 | Unity マニュアル [公式]

頂点プログラムとフラグメントプログラム – チュートリアル | Unity 2019.4 マニュアル [公式]

参考:

Vertex and Fragment Shader Examples のサンプルを試しつつメモ – Qiita

固定関数シェーダー

**LEGACY**

ShaderLab で記述する。固定関数シェーダーはインポート時に頂点シェーダー/フラグメントシェーダーに変換される。

ドキュメント:

ShaderLab と固定関数シェーダー – チュートリアル | Unity 2019.4 マニュアル [公式]

参考:

Shader メモ 固定関数シェーダ – Qiita

シェーダー変数

ドキュメント:

ビルトインのシェーダー変数 | Unity マニュアル [公式]

参考:

シェーダで使える定義済値 – Qiita

マクロ

参考:

シェーダでマクロを使う | LIGHT11

インクルード (.cginc ファイル)

自動的にインクルードされるファイル
  • HLSLSupport.cginc ヘルパーマクロ及びクロスプラットフォームのシェーダーコンパイルの定義
  • UnityShaderVariables.cginc グローバル変数
標準インクルードファイル
  • UnityCG.cginc ヘルパー関数
  • AutoLight.cginc ライティングやシャドウで用いる関数
  • TerrainEngine.cginc 地形及び植生用のシェーダーヘルパー関数
サーフェスシェーダー用インクルードファイル

サーフェスシェーダーを記述すると自動的に含まれる。

  • Lighting.cginc 標準サーフェスシェーダーライティングモデル
データ構造

UnityCG.cginc で定義されているデータ構造

  • appdata_base
  • appdata_tan
  • appdata_full
  • appdata_img
パス
  • プロジェクト内 #include "Assets/Shaders/Example.cginc"
  • 相対パス #include "./path/to/file.cginc"
  • Unity 組み込み #include "FileName.cginc" (※ファイル名のみでインクルードできる)

ドキュメント:

ビルトインのシェーダー include ファイル | Unity マニュアル [公式]

ビルトインシェーダーヘルパー機能 | Unity マニュアル [公式]

参考:

よく使うシェーダー関数は cginc を作ると便利 – Qiita

シェーダで cginc ファイルをインクルードして使う | LIGHT11

Shader 書く人は .cginc があると幸せになれる – Qiita

シェーダーエラー failed to open source file: ‘cginc’ | ゲームの作り方!

failed to open source file: ‘~~~~.cginc’ とエラーが出る時の対処法 | kan のメモ帳

Where can I find the reference of “appdata_img”? – Unity Forum

How to set custom CGIncludes folder? – Unity Forum

Overriding UnityGC.cginc – Unity Forum

How to specify my CGIncludes directories? – Unity Discussions

セマンティクス

頂点データ
  • POSITION
  • NORMAL
  • TEXCORRD0
  • TEXCORRD1
  • TEXCORRD2
  • TEXCORRD3
  • TANGENT
  • COLOR
レンダーターゲット
  • SV_TARGET
  • SV_TARGET1, SV_TARGET2, …
  • SV_DEPTH
ラスタライズ
  • SV_POSITION
その他
  • VPOS / UNITY_VPOS_TYPE
  • VFACE
  • SV_VertexID

ドキュメント:

シェーダーセマンティクス | Unity マニュアル [公式]

Semantics | Microsoft Docs [公式]

参考:

シェーダーセマンティクスまとめ – Qiita

定義済みマクロ

ドキュメント:

定義済みシェーダープリプロセッサーマクロ | Unity マニュアル [公式]

プロパティ

ドキュメント:

マテリアルプロパティの定義 | Unity 2020.3 マニュアル [公式]

Cg/HLSL でシェーダープロパティを参照する | Unity マニュアル [公式]

シェーダーのデータ型と精度 | Unity マニュアル [公式]

座標系

  • レンダーテクスチャ座標
  • UV 座標
  • クリップスペース座標
  • デプスバッファの値域

参考:

様々なグラフィックス API のシェーダーの作成 | Unity マニュアル [公式]

SubShader タグ

種類
  • Queue レンダリング順序を指定する
  • RenderType シェーダーの置き換え及びカメラ深度テクスチャの生成に使用される
  • DisableBatching バッチングを無効化する
  • ForceNoShadowCasting 影を投影しない
  • IgnoreProjector プロジェクターからの影響を受けない
  • CanUseSpriteAtlas スプライトアトラスと互換性がある
  • PreviewType プレビューの形状を指定する

ドキュメント:

タグを SubShader に割り当てる | Unity マニュアル [公式]

参考:

SubShader と Pass の中で使用できる Tag リスト | 渋谷ほととぎす通信

レンダーキュー (Queue)

マテリアルでカスタムレンダーキューを指定しなかった場合、シェーダーにおけるキューの指定値が使われる。

参考:

マテリアルの描画がシェーダーの Queue 順に処理されない原因と対策 | 神様は有休消化中です。

カリング (Culling)

  • Back 表面のみレンダリングする (デフォルト)
  • Front 裏面のみレンダリングする
  • Off 両面をレンダリングする

ドキュメント:

Cull – ShaderLab コマンド | Unity マニュアル [公式]

参考:

カリング制御可能な標準シェーダーを作る | Kludge Factory

互換性/コンパイルターゲット

ドキュメント:

プラットフォーム特有のレンダリングの違い | Unity 2019.4 マニュアル [公式]

シェーダーコンパイルターゲットレベル | Unity マニュアル [公式]

レンダリングパス

  • フォワードシェーディング (Forward Rendering)
  • ディファードシェーディング (Deferred Shading)
こちらのページを参照

参考:

Forward レンダリングと Deferred レンダリングの違いを軽くまとめてみた – Qiita

Forward Rendering と Deferred Shading | しゅみぷろ

Deferred Shading でライトを贅沢に使いたい!基本的な概念の説明とメリデメを考察 | LIGHT11

コンパイル

非同期シェーダーコンパイル

コンパイル済みでないシェーダーバリアントを描画する際に、そのシェーダーバリアントをコンパイルキューに追加する。コンパイルが完了するまでの間、シアン (水色) のダミーシェーダーによって代わりに描画を実行する。

コード
  • Show Generated Code サーフェスシェーダーから生成されたシェーダーのコードを表示する。
  • Compile and Show Code シェーダーをコンパイルし、生成された GPU コード (逆アセンブルコード) を表示する。

ドキュメント:

シェーダーのコンパイル | Unity マニュアル [公式]

非同期シェーダーコンパイル | Unity マニュアル [公式]

シェーダーアセット | Unity マニュアル [公式]

デバッグ

ドキュメント:

RenderDoc の統合 | Unity マニュアル [公式]

Visual Studio を使った DirectX 11/12 シェーダーのデバッグ | Unity 2019.4 マニュアル [公式]

まとめ/Tips

こちらのページを参照

シェーダチートシート | LIGHT11

Unity Shader まとめ | ゆにてく備忘録

Unity Shader 入門した頃の自分に教えたい事 – Qiita

シェーダースニペット集 | 黒鳥のメモ

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA