Unity Days

Unity や VR/AR に関すること。たまにblender。

Shader 勉強メモ 「シェーダーとは?」

Unityでのシェーダーの位置づけ「シェーダーで何ができる?」

グラフィックスパイプライン:一連の描画工程

CPU上でのドローコール

 

バーテックスシェーダー

頂点数の増減・プリミティブの変更を含まない頂点属性の変更

プリミティブアセンブリ

 

テッセレーションシェーダー

プリミティブの分割粒度を変更できる

ジオメトリーシェーダー

頂点数の増減・プリミティブの変更を含む頂点属性の変更

ラスタライゼーション

 

フラグメントシェーダー

テクスチャやオブジェクトの表面情報を用いた複雑な陰影処理

ROP処理

 

フレームバッファの出力

 

※バーテックス=頂点情報、フラグメント=色情報・深度情報、プリミティブ=点と直線と三角形からなる基本図形

グラフィックスパイプライン外でのシェーダーの利用

コンピュートシェーダー

GPUでの汎用計算(GPGPU)、物理シミュレーション、画像処理/画像認識/ポストエフェクト、機械学習などの用途

Unity のコンピュートシェーダーは DirectX 11 の DirectCompute テクノロジに非常に近いものです。コンピュートシェーダーを実行できるプラットホームは以下のとおりです。

DirectX 11 グラフィックス API と Shader Model 5.0 GPU を伴う WindowsWindows ストア

・現段階で一般的に使用されている OpenGL プラットフォーム (LinuxWindows 上の OpenGL 4.3、Android 上の OpenGL ES 3.1)。Mac OS XOpenGL 4.3 に対応していないため、コンピュートシェーダーはまだ、利用することはできません。

・現段階で一般的に使用されているコンソール (Sony PS4Microsoft XboxOne)。

ー『Unity - マニュアル: コンピュートシェーダー』より引用

 Unityでのシェーダーの扱い「シェーダーをどうやって使う?」

Shader Labと呼ばれるUnity独自の形式。各種シェーディング言語で書かれたシェーダーをShader Labに埋め込むことでGPUに計算させることができる。以下のフォーマットで書かれる。

Shader “Tutorial/Test”{

              Properties{

 [UnityEditer上から編集できる変数やテクスチャの指定などの設定]

              }

              SubShader{

                            Pass{

                [各種シェーディング言語で書かれたシェーダー]

                            }

              }

              FallBack “Diffuse”

}

シェーディング言語の種類

GLSL (OpenGL Shading Language)

C言語ライクなシェーディング言語

Cg (C for Graphics)

NVIDIAが開発。2012年に開発終了。

HLSL (High Level Shading Language)

Microsoftが開発。コンピュートシェーダーも書ける。

MSL (Metal Shading Language)

Appleが開発。macOS/iOSに対応。

シェーダー実行時の処理

Shader Labの形式にCg/HLSLで記述→実行時プラットフォーム毎にGLSLに変換される。

 

シェーダー関連の気になる記事

Unity - マニュアル: グラフィックスコマンドバッファ

Unity - マニュアル: コンピュートシェーダー

Unity - マニュアル: DirectX 11 と OpenGL Core

Unity - マニュアル: 非同期テクスチャアップロード

Unity 上に自分で物理エンジンを実装したい - yuki-koyama's blog

Unityのシェーダーについて自分なりにまとめてみた - SSSSLIDE

Unityのシェーダを自分の言葉で説明してみる - 渋谷ほととぎす通信

 「塗り」を表現する技術 - SSSSLIDE

Unity備忘録: Unityのshaderまとめ(Shader Lab)