次の項目は別ページに分割しました。
関連ページ:
シェーダーに関するツールは次のページにまとめています。
シェーダー/マテリアルの一般的な使い方は次のページにまとめています。
ShaderLab
- サーフェスシェーダー
- 頂点シェーダー/フラグメントシェーダー
- 固定関数シェーダー
公式サイト:
概要
参考:
シェーダーについて自分なりにまとめてみた – Speaker Deck
シェーダを書けるプログラマになろう – SlideShare
導入
ドキュメント:
シェーダーを書く | Unity 2019.4 マニュアル [公式]
参考:
ランバート反射/フォン反射/フレネル効果を Unity で実装した話 – Qiita
Lambert 拡散反射シェーダーを作る | 3DCG school
使い方
参考:
シェーダの基礎を勉強してみたのでやる気出してまとめてみた | 凹みTips
シェーダーによる色の変更、発光、光沢を持たせない設定 | @IT
シェーダーを書いてみよう! ShaderLab の簡単な書き方! | 侍エンジニア塾ブログ
入門
参考:
Unlit Shader の要素を全て解説 | アマガミナブログ
7日間でマスターする Unity シェーダ入門 | おもちゃラボ
視聴:
Unity シェーダープログラム入門 (AMAGAMI) – YouTube
書き方
ドキュメント:
ShaderLab シンタックス | Unity 2019.4 マニュアル [公式]
ShaderLab と固定関数シェーダー – チュートリアル | Unity 2019.4 マニュアル [公式]
サーフェスシェーダーの記述 | Unity マニュアル [公式]
Unity で使用するシェーダー言語 | Unity 2018.4 マニュアル [公式]
参考:
シェーダの基礎を勉強してみたのでやる気出してまとめてみた | 凹みTips
Surface シェーダーとフラグメントシェーダーの違いを軽くまとめてみた – Qiita
サーフェスシェーダー
照明あるいは影による影響を考慮してメッシュを描画する。Cg/HLSL で記述する。フォワードレンダリングあるいはディファードレンダリングをサポートする。サーフェスシェーダーは内部的に頂点シェーダー/フラグメントシェーダーに変換される。
ドキュメント:
サーフェスシェーダーの記述 | Unity マニュアル [公式]
参考:
頂点シェーダー/フラグメントシェーダー
ライティングを必要としない場合に用いる。あるいは、頂点の情報をダイレクトに扱う低レベルシェーダーを作成する場合にも用いる。Cg/HLSL で記述する。照明あるいは影を扱う場合はサーフェスシェーダーの方が向いている。
ドキュメント:
頂点シェーダーとフラグメントシェーダーの記述 | Unity 2019.4 マニュアル [公式]
カスタムシェーダーの基礎 | Unity マニュアル [公式]
頂点プログラムとフラグメントプログラム – チュートリアル | Unity 2019.4 マニュアル [公式]
参考:
Vertex and Fragment Shader Examples のサンプルを試しつつメモ – Qiita
固定関数シェーダー
**LEGACY**
ShaderLab で記述する。固定関数シェーダーはインポート時に頂点シェーダー/フラグメントシェーダーに変換される。
ドキュメント:
ShaderLab と固定関数シェーダー – チュートリアル | Unity 2019.4 マニュアル [公式]
参考:
シェーダー変数
ドキュメント:
ビルトインのシェーダー変数 | Unity マニュアル [公式]
参考:
マクロ
参考:
インクルード (.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 [公式]
参考:
定義済みマクロ
ドキュメント:
定義済みシェーダープリプロセッサーマクロ | 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 マニュアル [公式]
デバッグ
ドキュメント:
RenderDoc の統合 | Unity マニュアル [公式]
Visual Studio を使った DirectX 11/12 シェーダーのデバッグ | Unity 2019.4 マニュアル [公式]