イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

Unity シェーダ関連まとめ

+++++別のシェーダ関連記事リスト

Shaderの勉強に役立ったサイト - イラスト、モデリング、Unity、VR関連

ShaderLab 定義済みの値と座標空間とその変換について - イラスト、モデリング、Unity、VR関連

Shader プロジェクション変換について - イラスト、モデリング、Unity、VR関連

ShadersLaboratryのサンプルを雑に読んでいく-Miscellaneous - イラスト、モデリング、Unity、VR関連

ShadersLaboratryのサンプルを雑に読んでいく-noice - イラスト、モデリング、Unity、VR関連

ShadersLaboratryのサンプルを読んでいく記事-surface - イラスト、モデリング、Unity、VR関連

ShadersLaboratryのサンプルを読んでいく記事-post rendering - イラスト、モデリング、Unity、VR関連

 

++頂点シェーダ

頂点座標を操作することでメッシュの変形などが可能

頂点単位でコールされる(多分

 

++フラグメントシェーダ

ピクセルの色を変えられる。ラスタライザにより頂点からピクセルに変換されたデータが渡されるので、ピクセル単位でコールされる(多分

 

++ライティング

【連載】Unity時代の3D入門 – 第5回「拡散反射ライティング」 – てっくぼっと!

【連載】Unity時代の3D入門 – 第9回「ノーマルマッピング」 – てっくぼっと!

【Unityシェーダ入門】ランバート拡散照明モデルを試す - おもちゃラボ

 

++サーフェイスシェーダ

フラグメントシェーダのラッパー、扱いやすくしてくれる

 

++ラスタライズ・ラスタライザ

頂点間を線で結び頂点間の隙間を補完してくれる

ポリゴンやその他形状データをフラグメントと呼ばれるピクセルデータに変換する作業をラスタライズと呼ぶ。

f:id:arumogina:20190605153519p:plain

プログラマブル・シェーダによる積極的なGPUの活用(4/5) - @IT

 

++レンダリングパイプライン

ジオメトリ(頂点が持つ情報)を加工し画面に出力するまでの一連の処理工程

【シェーダ】レンダリングパイプライン

 

++GPUパーティクル・ジオメトリシェーダ

シェーダー芸(GPUパーティクル)入門~概要編 – ニムサイト

ジオメトリシェーダ入門 - e.blog

3Dモデルを各ポリゴンに分割して移動や変形を行う事ができます。1ポリゴンを1パーティクルと見立てて移動を行うことで、GPUパーティクルを実現します。

 

++テッセレーション

GPUでポリゴンの分割を行うことにより、滑らかな表現になるようにするなど負荷軽量化のための技術

Unity で距離に応じたテッセレーションを行ってみた - 凹みTips

 

++ポストエフェクト・post renderring

カメラから見たレンダリング結果をテクスチャとして保存し、そのテクスチャをシェーダに渡すことで加工を行う。頂点情報もテクスチャに残ってるらしくvertシェーダが使用可能(よくわかってない)

c#スクリプトが必要

関連:コマンドバッファ

ShadersLaboratryのサンプルを読んでいく記事-post rendering - イラスト、モデリング、Unity、VR関連

 

++ディファードレンダリング

1回目のパスでG-Bufferにジオメトリ(頂点の情報)を書き込んでおき、2回目のパスでそのジオメトリ情報を使ってライティングを行う。

ライティングをまとめて行うことでライティングの負荷を軽量化するなどして多くのライトを使用できるようになる技術。

レンダリング、CommnadBuffer,G-Buffer,Deferred Shading(ディファードレンダリング)について - イラスト、モデリング、Unity、VR関連 

古典的な遅延シェーディングの秋 2014 - Engine Trouble

 

++ステンシルバッファ

【Unityシェーダ入門】ステンシルバッファを使って隠れた部分を描く - おもちゃラボ

ある枠内にある場合のみオブジェクトを表示したり、非表示にしたり出来るようになる。表示するかどうかの判定を ステンシルテスト、と呼ぶ

 

++レイマーチング

メッシュではなく、距離関数を用いてオブジェクトをレンダリングする手法。フラクタル図形を描ける

[GLSL] レイマーチング入門 vol.1 - Qiita

 

魔法使いになりたい人のためのシェーダーライブコーディング入門 - Qiita

 

レイマーチングには、

フォワードレンダリングでのオブジェクトスペース

Unity でオブジェクトスペースの Raymarching をフォワードレンダリングでやってみた - 凹みTips

ディファードレンダリングでのオブジェクトスペース

Unity でオブジェクトスペースのレイマーチをやってみた - 凹みTips

ディファードレンダリングとコマンドバッファを使った手法

Unity で Command Buffer を使って Raymarching をしてみた - 凹みTips

の3種類があるっぽい

コマンドバッファを使うものはc#が必要 

 

また手法によってレイマーチのやり方も少し違ってくる

スクリーン全体で行うときはレイの開始点がカメラの Near Clip 位置でしたが、オブジェクトスペースの場合これをポリゴン表面の位置にすることができ、より少ないループで数式で表現される図形の近傍までレイが到達できます。

 

++GrabPass

あるオブジェクトに透過して映る?レンダリング結果を保存しテクスチャとして保存可能。ポストエフェクトと似ているが、あちらはカメラ限定(多分

【Unity】【シェーダ】GrabPassの説明とシェーダの実装例 - LIGHT11

 【Unity】マルチパスシェーダーのやり方(フラグメントシェーダーの場合) - Qiita

 

++カスタムレンダーテクスチャ

CustomRenderTextureを使って波紋エフェクトを作る - e.blog

シェーダでテクスチャの加工を行い、それをテクスチャとして利用できる、というものらしい

 

++デプスバッファ

カメラからオブジェクトまでの距離を取得出来る

【Unityシェーダ入門】デプスバッファの内容を表示する - おもちゃラボ

 

++コマンドバッファ

Unity 5 の CommandBuffer を利用したレンダリングパイプラインの拡張について調べてみた - 凹みTips

カメラから見たレンダリング結果をテクスチャとして保存し、それを任意のタイミングで加工したり使用したりすることが可能になる。GrabPassとの違いは任意のタイミングで可能なこと。コマンドバッファはその任意のタイミングで実行する命令を保存しておくバッファ?

c#スクリプトが必要

 

++G-Buffer

ジオメトリバッファ、オブジェクトの情報を保存しておくバッファ。デプスやカラー、法線などを保存する。

古典的な遅延シェーディングの秋 2014 - Engine Trouble

 

++ソフトパーティクル

【Unity】Soft Particleを使って、ポリゴンとパーティクルの交差点がハッキリ見えないようにする - テラシュールブログ

 

++深度テスト(ZTest)・ZWrite

通常、ポリゴンは奥にあるものからカメラの手前にあるものへと順番に描写されるが、これは見えないポリゴンまで描写されていて効率が悪い。そこで手前にあるもののみ描写するようにするのがZTest.

 

ZWrite が有効なとき、そのポリゴンが描画されると、対応する画素 (バッファ) に深度情報と色情報が書き込まれ、既に書き込まれているときはカメラと近い方、つまり深度が小さい方が書き込まれる

 通常はすでに書き込まれたポリゴンよりも手前にあるポリゴンを描画するように設定されているが、ZTest の設定を変更することによって、常にポリゴンを描画するにようにしたり、より奥にあるポリゴンを描画するようにできる

なお、深度情報は実際にはピクセル単位で管理されている

デプスバッファ(Zバッファ)

Unity でShaderの勉強 その3 - Qiita

ZTest Always同士のとき、Queueが高いものが優先される。

ZTest AlwaysのQueueが低く、一方がZTest LEqual(デフォルト)でQueueが高い場合、後者が描画される。上のサイトによれば、ZTest Alwaysは自身よりQueueが低いオブジェクトに対しては常に優先されるが、Queueが高いオブジェクトに対してはそのオブジェクトのZTestが有効になるのでは?と。

 

ZWrite Offのとき、Queueの高いものの描画が優先される

++アルファテスト

アルファブレンディングがオブジェクトを透過させるだけで、そこにあるため反射や影が出来るのに対して、アルファテストは存在自体を消す

 ただアルファテストを使うよりもClipを使った方がいいとのこと

Unityのアルファテストがレガシーなものになっていた件 - 渋谷ほととぎす通信

Unity シェーダーチュートリアル アルファとアルファテスト – Tsumiki Tech Times|積木製作

 

++GPU Instancing

GPU Instancing を使うと同一メッシュ・マテリアルを使用したオブジェクトを一度に大量に描画することが出来ます。

凹みTips

【Unity】GPU Instancingで遊ぶ - テラシュールブログ

【Unity】パーティクルをGPU Instancingで描画してみる & 対応シェーダーを自作してみる - テラシュールブログ

 

++Fog

【Unity】Fogの使い方・シェーダの書き方(Forwardレンダリング) - LIGHT11

 

++RenderTexture

カメラに映る映像をフレームごとに(多分)動的に生成されるテクスチャとして使用できるもの

【Unity】RenderTextureとプロジェクターについて - はらけんログ

 

++ColorMask

【Unity】【シェーダ】カラーマスクの使い方とインスペクタ拡張 - LIGHT11

 

++HLSLとGLSLの変換

用語ではないが、GLSLのコードを読むとき便利なので掲載

GLSLをHLSLに書き換える - Qiita

 

++_Timeについて

Unity - マニュアル: ShaderLab 定義済みの値

_Timeのtの単位は秒

なので1秒経てば、_TIme.yの整数部が1増える。

小数部もあり、精度が不明だが、0.5秒経てば0.5増える。

 

++行列計算のリファレンス

Per-Component Math Operations - Windows applications | Microsoft Docs

 

++数値計算メソッド

組み込み関数 (DirectX HLSL) | Microsoft Docs

 

++_Timeなどのビルトインシェーダ

Unity - マニュアル: ShaderLab 定義済みの値

 

++シェーダの結果を保存する

Shader上で1つ前のフレームの計算結果を使う - Qiita

c#が必要

 

++グラフデモ

https://www.desmos.com/

www.desmos.com