シェーダーに関するツールは次のページにまとめています。

シェーダー/マテリアルの一般的な使い方は次のページにまとめています。

ShaderLab

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

参考:

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

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

書き方

こちらのページを参照

参考:

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

Unity ShaderLab ノート – Qiita

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

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

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

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

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

導入

参考:

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

Shader を勉強する – Qiita

Unity で Shader の勉強 その1 – Qiita

Unity で Shader の勉強 その2 – Qiita

Unity で Shader の勉強 その3 – Qiita

Unity で Shader の勉強 その4 – Qiita

Unity で Shader の勉強 その5 – Qiita

使い方

参考:

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

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

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

Unity で Shader の勉強 その1 – Qiita

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

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

入門

参考:

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

概要

参考:

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

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

サーフェスシェーダー

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

こちらのページを参照

参考:

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

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

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

こちらのページを参照

参考:

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

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

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

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

固定関数シェーダー

**LEGACY**

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

参考:

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

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

シェーダー変数

参考:

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

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

マクロ

参考:

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

シェーダーバリアント (Shader Variant)

プラグマ (#pragma キーワード/コンパイラーディレクティブ)

  • multi_compileシェーダーバリアントを生成する
  • multi_compile_localシェーダーバリアントを生成する/キーワードはローカルに作用する
  • shader_feature未使用のバリアントはビルドに含まれない
  • shader_feature_local未使用のバリアントはビルドに含まれない/キーワードはローカルに作用する

定義できるグローバルキーワードは256個に制限される。Unity は内部的に60個のグローバルキーワードを使用する。ユーザーが定義できるグローバルキーワードの上限は実質的に190個程度に制限される。ローカルキーワードはシェーダー毎に64個に制限される。

ビルトインショートカット

  • multi_compile_fwdbase
  • multi_compile_fwdadd
  • multi_compile_fwdadd_fullshadows
  • multi_compile_fog

参考:

Unity の Shader Variant について調べてみた – Qiita

shader_feature や multi_compile でシェーダのバリアントを作る | LIGHT11

ShaderVariant とは? | 黒河優介

AssetBundle と ShaderVariant の関係 | 黒河優介

ShaderVariant と最適化周り | 黒河優介

Shader Variant について調べてみた | しゅみぷろ

複数のシェーダープログラムのバリアントを作る | Unity 2018.4 マニュアル [公式]

シェーダーのロード時間の最適化 | Unity 2018.4 マニュアル [公式]

マテリアルパラメーターへのスクリプトを使ったアクセスと変更 | Unity マニュアル [公式]

Shader Variants and Keywords | Unity Manual [Official]

シェーダーキーワードを使う

参考:

Shader の定義済みキーワードを動的に有効/無効化する | KAZUPON 研究室

マテリアルパラメーターへのスクリプトを使ったアクセスと変更 | Unity マニュアル [公式]

Shader.EnableKeyword | Unity スクリプトリファレンス [公式]

Shader.DisableKeyword | Unity スクリプトリファレンス [公式]

How do I set a shader setting/property at runtime using MonoBehaviour? – Stack Overflow

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

自動的にインクルードされるファイル

  • HLSLSupport.cgincヘルパーマクロ及びクロスプラットフォームのシェーダーコンパイルの定義
  • UnityShaderVariables.cgincグローバル変数

標準インクルードファイル

  • UnityCG.cgincヘルパー関数
  • AutoLight.cgincライティングやシャドウで用いる関数
  • TerrainEngine.cginc地形及び植生用のシェーダーヘルパー関数

サーフェスシェーダー用インクルードファイル

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

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

データ構造

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

  • appdata_base
  • appdata_tan
  • appdata_full
  • appdata_img

参考:

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

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

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

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

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

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

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

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

セマンティクス

頂点データ

  • 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 のシェーダーセマンティクスまとめ – Qiita

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

Semantics | Microsoft Docs [公式]

定義済みマクロ

参考:

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

プロパティー

参考:

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

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

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

座標系

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

参考:

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

SubShader タグ

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

参考:

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

SubShader 内のタグ | Unity マニュアル [公式]

レンダーキュー (Queue)

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

参考:

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

カリング (Culling)

参考:

Culling と Depth Testing | Unity 2018.4 マニュアル [公式]

デプスバッファ/デプステスト (Depth Testing)

参考:

オブジェクトが重なった部分をくり抜く | おもちゃラボ

カメラから見た深度を描画する | LIGHT11

Culling と Depth Testing | Unity 2018.4 マニュアル [公式]

アルファテスト (Alpha Testing)

**LEGACY**

参考:

旧 Alpha Testing | Unity マニュアル [公式]

カラーマスク (ColorMask)

参考:

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

MaterialPropertyDrawer

参考:

シェーダプロパティ用のアトリビュートを自作する MaterialPropertyDrawer | LIGHT11

シェーダを実装する時に MaterialPropertyDrawer を使用して Inspector の表示をカスタマイズする | コガネブログ

マルチコンパイル (multi_compile)

参考:

Multi-Compile Shaders | Martin Palko

Replaced Shaders

Replacement Shader タグ

  • Opaque
  • Transparent
  • TransparentCutout
  • Background
  • Overlay
  • TreeOpaque
  • TreeTransparentCutout
  • TreeBillboard
  • Grass
  • GrassBillboard

参考:

Replaced Shaders でのレンダリング | Unity マニュアル [公式]

Shader Variant Collections

参考:

Shader Variant Collections | Unity Manual [Official]

コンピュートシェーダー

参考:

コンピュートシェーダー | Unity マニュアル [公式]

TEXCOORD

参考:

使用する TEXCOORD をマテリアルから指定できるようにする | LIGHT11

Particle System の Custom Vertex Streams と Custom Data の使い方まとめ | LIGHT11

Blend

参考:

Blend を試してみる – Qiita

Texture Combiners

参考:

Texture Combiners | Unity マニュアル [公式]

サンプラー

参考:

サンプラー状態の利用 | Unity 2018.4 マニュアル [公式]

透過/半透明シェーダー

参考:

Unity フラグメントシェーダーで背景を透過してみる | マカロン

スタンダードシェーダーで モデルを綺麗に半透明表示する – Qiita

3D モデルの半透明をキレイに表示するシェーダを実装する | コガネブログ

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

何も描画しないシェーダーを作る

Shader "Custom/Void"
{
    SubShader
    {
        ColorMask 0 Zwrite Off
        Pass {}
    }
}

参考:

不要パーツを消す「何もしない透明な Unity シェーダー」| サークル獏の佐藤敏 Unity とか備忘録

発光

参考:

Glow っぽいシェーダを書いてみた – Qiita

スクリーンスペースブーリアン

参考:

Unity でスクリーンスペースのブーリアン演算をやってみた | 凹みTips

頂点アニメーションテクスチャ/VAT シェーダー

参考:

Unity のシェーダー開発方法のまとめと備忘録・頂点アニメーションテクスチャ (VAT) シェーダー – Qiita

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

参考:

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

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

レンダリングパス

参考:

ForwardRendering と DeferredShading | しゅみぷろ

ディザリング

  • _DitherMaskLOD2D

参考:

ビルトインのディザ抜き用テクスチャを取得する | LIGHT11

旧シェーダー

Standard Shader が導入される以前に使用されていた各用途毎に個別に記述されたシェーダー。

ファミリー

法線シェーダー

透明シェーダー

参考:

旧シェーダーコード | Unity マニュアル [公式]

GLSL を移植する

参考:

Unity に GLSL (サーフェスシェーダー) を書く方法 | すだちキャンパス

global keywords exceeded エラー

シェーダーキーワードを制限以上に使用しているため一部のキーワードが無視される旨のエラーが発生する。

Maximum number (256) of shader global keywords exceeded, keyword _XXX will be ignored. You will have to delete some shaders or make them use less keywords.

対処法

  • 使用していないシェーダーあるいはキーワードをプロジェクトから取り除く。
  • グローバルキーワードの代わりにローカルキーワードを使用する。
  • キーワードを固定化 (ベイク) する。
  • Shader Control アセットを使って対処する。

参考:

Maximum number (256) of shader global keywords exceeded, keyword will be ignored and black materials – Unity Forum

Maximum number (256) of shader keywords exceeded – Unity Forum

Maximum number (256) of shader global keywords exceeded – Unity Forum

Maximum number (256) of shader keywords exceeded and materials are pink – Unity Forum

The “Maximum number (256) of shaders” error – Unity Forum

Shader keyword limit – Unity Forum

Maximum number (256) of shader global keywords exceeded, keyword _DISTORTION_ON will be ignored. You will have to delete some shaders or make them use less keywords. – Unity Answers

Maximum number (256) of shader global keywords exceeded, keyword Unity – Stack Overflow

デバッグ

参考:

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

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

パフォーマンス

旧シェーダーのパフォーマンス

およそ次の順序で描画負荷が高くなる。

  • Unlit
  • VertexLit
  • Diffuse
  • Normal mapped
  • Specular
  • Normal Mapped Specular
  • Parallax Normal mapped
  • Parallax Normal Mapped Specular

参考:

Unity シェーダーのパフォーマンス | Unity マニュアル [公式]

シェーダーを書く場合のパフォーマンスのヒント | Unity マニュアル [公式]

ソースコード

ビルトインシェーダー/Standard Shader のソースコードを取得するには、「Download Archive (Unity) 」にアクセスして、該当するバージョンの「ダウンロード」ボタンをクリックして「ビルトインシェーダー」を選択する。

参考:

Unity の Standard シェーダーのソースコードを取得する | MR が楽しい

まとめ/Tips

参考:

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

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

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

Shader Code | Unify Community Wiki

資料

参考:

Unity でシェーダを学ぶ時に参考した本とか – Qiita

シェーダー本を書いて得た知見まとめ – Qiita

リンク

参考:

シェーダに関するオススメ記事まとめ 120個 | コガネブログ

無料のオススメシェーダまとめ 110個 | コガネブログ

テキスト/解説

参考:

Unity シェーダープログラミングの教科書 ShaderLab 言語解説編 (染井吉野ゲームズ) | BOOTH

Shader Tutorials (Ronja)

参考:

Shader Tutorials by Ronja

ronja-tutorials/ShaderTutorials: Unity Shader Tutorials – GitHub

ボロノイノイズによるステンドグラスシェーダを実装できる Shader Tutorials 紹介 | コガネブログ

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

コメントを残す

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