「バーテックスシェーダー」の版間の差分
imported>Administrator (→主な用途) |
imported>Administrator |
||
1行目: | 1行目: | ||
− | '''バーテックスシェーダー'''([[英語]]:Vertex Shader、和名:頂点シェーダー)とは、[[シェーダー]]のうち、[[グローバル変数]](実質的に[[定数]])と[[ポリゴン]] | + | '''バーテックスシェーダー'''([[英語]]:Vertex Shader、和名:頂点シェーダー)とは、[[シェーダー]]のうち、[[グローバル変数]](実質的に[[定数]])と[[ポリゴン]]の[[頂点データ]]が入力され、それを加工して、出力するものをいう。 |
7行目: | 7行目: | ||
[[file:バーテックスシェーダー.png|none]] | [[file:バーテックスシェーダー.png|none]] | ||
− | バーテックスシェーダーは、[[バーテックスバッファ]]および[[インデックスバッファ]] | + | バーテックスシェーダーは、[[バーテックスバッファ]]および[[インデックスバッファ]]で無駄を削がれた[[頂点データ]]群を入力として受け取る。 |
− | + | 出力も[[頂点データ]]群である。この出力は[[ジオメトリシェーダー]]に渡されて[[ピクセル]]群に分解され、その後[[ピクセルシェーダー]]に渡される。なお、近年のパイプラインではバーテックスシェーダーの直後に「[[ハルシェーダー]]」「[[テッセレーター]]」「[[ドメインシェーダー]]」の[[テッセレーション]]三兄弟(実質3つで1つ)を経由することもある。 | |
== 主な用途 == | == 主な用途 == |
2018年8月31日 (金) 12:30時点における版
バーテックスシェーダー(英語:Vertex Shader、和名:頂点シェーダー)とは、シェーダーのうち、グローバル変数(実質的に定数)とポリゴンの頂点データが入力され、それを加工して、出力するものをいう。
概要
バーテックスシェーダーとピクセルシェーダーの2種類は基本中の基本であるため、シェーダーモデルを問わず、DirectXやMonoGame、Unityなどのプラットフォームも問わず扱えるはずである。
バーテックスシェーダーは、バーテックスバッファおよびインデックスバッファで無駄を削がれた頂点データ群を入力として受け取る。
出力も頂点データ群である。この出力はジオメトリシェーダーに渡されてピクセル群に分解され、その後ピクセルシェーダーに渡される。なお、近年のパイプラインではバーテックスシェーダーの直後に「ハルシェーダー」「テッセレーター」「ドメインシェーダー」のテッセレーション三兄弟(実質3つで1つ)を経由することもある。
主な用途
主に服や草などが「なびく系」のアニメーションを行うのに用いられていることが多い。これらは物理演算エンジンで細かく計算してもいいが、たとえば草原の草を1本単位で物理演算するのはCPUでは論外、専用ハードウエアでも厳しい。そういった場面でそれらしく見せるのに使われる。
また、小難しいことをしない場合はバーテックスシェーダーはほとんど使われず、頂点データにカメラ座標を行列乗算(カメラから見た位置に変換)して出力することも多い。MonoGameのサンプルプログラムではモデルとカメラのジオメトリ変換にCPUで計算していることが多いが、バーテックスシェーダーを使うとかなり速くなるよ。
頂点データの最適化
入力をそのまま出力するバーテックスシェーダーを用意して、そこにバーテックスバッファとインデックスバッファを投げ込む。するとインデックスバッファと同じサイズに無駄を削がれたバーテックスバッファが得られる(インデックスが頂点座標に置き換えられたものが得られる)。
この無駄の削がれたバーテックスバッファを物理演算エンジンにぶち込みレイキャストを使った当たり判定に用いると結構いい感じになる。
なお、OpenGL ES系ではバーテックスバッファは書き込み一方通行であり読み出せないのでこの方法は使えない。あまり変化のない物体であればPC上のOpenGLやDirectXでこの手法で無駄を削いだバーテックスバッファを事前に取得し、csvファイルなんかに保存しておき、iOSやAndroidなどのOpenGL ES系のプラットフォームではそれを利用するという手もある。アプリ内での計算量も減るので高速化にもなる。