Unityと数学と音楽の学習帳

Unityと数学、音楽の同時学習を目的としたブログ(個人的メモ帳:勉強中なので正確性はない)

UnityのShader作成用抽斗

Cg/HLSL でシェーダープロパティーを参照する
https://docs.unity3d.com/ja/current/Manual/SL-PropertiesInPrograms.html

成分ごとの演算 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509634(v=vs.85).aspx

tex2D等の組み込み関数 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509611(v=vs.85).aspx

メモ:「ベクトル×行列」等の積の演算は「*」は無理でmul()関数を利用する

UnityObjectToClipPos等のビルトインシェーダーヘルパー機能
https://docs.unity3d.com/ja/current/Manual/SL-BuiltinFunctions.html

_Time等のビルトインのシェーダー変数
https://docs.unity3d.com/ja/current/Manual/SL-UnityShaderVariables.html


Shader Unity Support
VisualStudio2015にインストールすると.shaderファイルに対してコード補完やハイライト表示が利用できるようになる
(VisualStudio2017には現在未対応)

機能:

  • 「.shader」内の「.cginc」ファイルのコード補完(UnityCG.cginc内の宣言や関数のコード補完に対応している)
  • C/C++スタイルのキーワードハイライト表示
  • 「.cginc」 「.shader」「.compute」ファイルをサポート
  • 括弧のマッチング

https://marketplace.visualstudio.com/items?itemName=MarcinODev.ShaderUnitySupport



グラフィックスコマンドバッファ
https://docs.unity3d.com/ja/current/Manual/GraphicsCommandBuffers.html

コンピュートシェーダー
https://docs.unity3d.com/ja/current/Manual/ComputeShaders.html

GPU インスタンシング
https://docs.unity3d.com/ja/current/Manual/GPUInstancing.html

カスタムシェーダー GUI
https://docs.unity3d.com/ja/current/Manual/SL-CustomShaderGUI.html

[Unity] シェーダを書く準備
http://qiita.com/edo_m18/items/b13f6a51f16ec5d72419

用語
https://msdn.microsoft.com/ja-jp/library/ff604996(v=xnagamestudio.40).aspx


単語・用語
Tranforms position 変換座標
homogenous space 均質空間(相同空間)
homology 相同性 共通の祖先を持つ共通の構造。相似の対義語(相似と相同は明確に違う)


リファレンス

Unity - マニュアル: 内蔵のシェーダー include ファイル
Unity - マニュアル: シェーダーのデータタイプと精度

資料

レンダリングパス
https://docs.unity3d.com/ja/current/Manual/RenderingPaths.html
https://docs.unity3d.com/ja/current/Manual/SL-RenderPipeline.html

フレームデバッガ
https://docs.unity3d.com/ja/current/Manual/FrameDebugger.html

サーフェイスシェーダー
ライティングに作用するシェーダーを書く場合
unity独自のあらかじめ用意された組み込みサーフェイスシェーダーのパーツを利用、流用して楽に自作シェーダーを作成出来る
(unityのライティングを利用したシェーダーを1から自分で組むのは大変らしい)
https://docs.unity3d.com/ja/current/Manual/SL-SurfaceShaders.html

リットシェーダー → 自分で作ったシェーダーの事を指すらしい?


頂点シェーダーとフラグメントシェーダーのプログラミング
フラグメントシェーダーは#pragmaステートメントでどのシェーダー関数を使ってコンパイルするかを示す
それぞれのスニペットには最低でも頂点プログラムとフラグメントプログラムが含まれていなければいけない
https://docs.unity3d.com/ja/current/Manual/SL-ShaderPrograms.html


セマンティクス
セマンティクス (DirectX HLSL).
セマンティクスは、シェーダー入力またはシェーダー出力に付加されている文字列で、パラメーターの使用目的に関する情報を伝達します。セマンティクスは、シェーダー ステージ間で渡されるすべての変数に指定する必要が あります
https://msdn.microsoft.com/ja-jp/library/bb509647(v=vs.85).aspx


<要点>
VisualStudioでHLSLファイルに対してインテリセンスやオートコンプリートを利かせるにはdirectXをインストールする必要がある
UnityやVisualSutdioのインストール方法によってインストールし忘れする事があるので注意


入力セマンティックと出力セマンティックがある。出力は"out"として宣言する
必要なセマンティックが足りない場合、シェーダーは異常終了する

セマンティックは、データがどこで生成されたかを識別します。セマンティックは、シェーダーの入力と出力を識別するオプションの識別子です。
セマンティクスは、次のいずれかの位置に記述します。

  • 構造体メンバーの後。
  • 関数の入力引数リスト内の引数の後。
  • 関数の入力引数リストの後。

組み込み関数 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509611(v=vs.85).aspx



成分ごとの演算 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509634(v=vs.85).aspx


フロー制御 (DirectX HLSL)
https://msdn.microsoft.com/ja-jp/library/bb509600(v=vs.85).aspx


POSITION は頂点位置、一般的には float3 か float4 です。
NORMAL は通常の頂点で、一般的には float3 です。
TEXCOORD0 は、第 1 の UV 座標で、一般的に、float2, float3, float4 です。
TEXCOORD1, TEXCOORD2, TEXCOORD3 は、それぞれ第 2、第 3、第 4 の UV 座標です。
TANGENT は、(ノーマルマッピングで使用される)接線ベクトルで、一般的には、 float4 です。
COLOR は、頂点ごとの色で、一般的には、 float4 です。

行列の積

ベクトルは行列で表記すると縦になる。ベクトルや行列は一般的に太字で表される

{\vec { { A } }=\textbf{A} =\begin{pmatrix} 1 \\ 2 \\ 3 \\ 4 \end{pmatrix}}

4次元のベクトルAは4行1列の行列Aと言える
この行列に対し転置行列を行うと下記のような1行4列となる

{\textbf{A}^{ T }=\left( 1,2,3,4 \right)}

変数名の右肩にあるTはTransposeのTを表している


ベクトルを行列として扱い計算した例

{\textbf{A}^{ T }=\left( 1,2,3,4 \right)}

{\textbf{B} =\begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}}

{\textbf{A}^{ T }\textbf{B}=\left( 1,2,3,4 \right) \begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}=1\times 2+2\times 3+3\times 4+4\times 5=40=\textbf{B}^{ T }\textbf{A}}

{\textbf{BA}^{ T }=\begin{pmatrix} 2 \\ 3 \\ 4 \\ 5 \end{pmatrix}\left( 1,2,3,4 \right) =\begin{pmatrix} 2\times 1 & 2\times 2 & 2\times 3 & 2\times 4 \\ 3\times 1 & 3\times 2 & 3\times 3 & 3\times 4 \\ 4\times 1 & 4\times 2 & 4\times 3 & 4\times 4 \\ 5\times 1 & 5\times 2 & 5\times 3 & 5\times 4 \end{pmatrix}=\begin{pmatrix} 2 & 4 & 6 & 8 \\ 3 & 6 & 9 & 12 \\ 4 & 8 & 12 & 16 \\ 5 & 10 & 15 & 20 \end{pmatrix}}

<行列の積の計算例>

─□ = ─

□| = |

|─ = □

─| = ・

─□| = ・

─□□| = ・

─□□□| = ・

□|─□|─ = (□|)(─□|)─ = |・─ = ・|─ = □

行列の積は計算順を変えると結果が変わる点に注意。カッコでくくる場合でも計算順は変更できない。但し ・ は「数」であり行列の積計算に対して順番的に自由な位置に再配置できる点に留意

|□ = NG

||= NG

─ ─ = NG

行列の積を考える場合、左から順番に二項演算で計算していく。その際、各次数が重要になってくる。まず左項の列数と右項の行数の次数が合致しない場合、計算そのものが成立しない。以下、LaTexで書くのが大変なのでPocketCasによる出力で例を並べてみる

f:id:cqbosinko:20170312110022p:plain