「バーテックスシェーダー」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
imported>Administrator
12行目: 12行目:
  
 
== 主な用途 ==
 
== 主な用途 ==
主に服や草などが「なびく系」のアニメーションを行うのに用いられていることが多い。これらは物理演算エンジンで細かく計算してもいいが、たとえば草原の草を1本単位で物理演算するのはCPUでは論外、専用ハードウエアでも厳しい。そういった場面でそれらしく見せるのに使われる。
+
主に服や草などが「なびく系」のアニメーションを行うのに用いられていることが多い。これらは[[物理演算エンジン]]で細かく計算してもいいが、たとえば草原の草を1本単位で物理演算するのは[[CPU]]では論外、専用ハードウエアでも厳しい。そういった場面でそれらしく見せるのに使われる。
  
小難しいことをしない場合はバーテックスシェーダーはほとんど使われず、頂点データにカメラ座標を行列乗算(カメラから見た位置に変換)して出力することも多い。[[MonoGame]]のサンプルプログラムではモデルとカメラの[[ジオメトリ変換]]に[[CPU]]で計算していることが多いが、バーテックスシェーダーを使うとかなり速くなるよ。
+
また、小難しいことをしない場合はバーテックスシェーダーはほとんど使われず、頂点データにカメラ座標を行列乗算(カメラから見た位置に変換)して出力することも多い。[[MonoGame]]のサンプルプログラムではモデルとカメラの[[ジオメトリ変換]]に[[CPU]]で計算していることが多いが、バーテックスシェーダーを使うとかなり速くなるよ。
 +
 
 +
=== 頂点データの最適化 ===
 +
入力をそのまま出力するバーテックスシェーダーを用意して、そこに[[バーテックスバッファ]]と[[インデックスバッファ]]を投げ込む。すると[[インデックスバッファ]]と同じサイズに無駄を削がれた[[バーテックスバッファ]]が得られる(インデックスが頂点座標に置き換えられたものが得られる)。
 +
 
 +
この無駄の削がれたバーテックスバッファを[[物理演算エンジン]]にぶち込み[[レイキャスト]]を使った当たり判定に用いると結構いい感じになる。
 +
 
 +
なお、[[OpenGL ES]]系では[[バーテックスバッファ]]は書き込み一方通行であり読み出せないのでこの方法は使えない。あまり変化のない物体であれば[[PC]]上の[[OpenGL]]や[[DirectX]]でこの手法で無駄を削いだバーテックスバッファを事前に取得し、[[csvファイル]]なんかに保存しておき、[[iOS]]や[[Android]]などのOpenGL ES系のプラットフォームではそれを利用するという手もある。[[アプリ]]内での計算量も減るので高速化にもなる。
  
 
== 関連項目 ==
 
== 関連項目 ==

2018年8月31日 (金) 03:11時点における版

バーテックスシェーダー英語:Vertex Shader、和名:頂点シェーダー)とは、シェーダーのうち、グローバル変数(実質的に定数)とポリゴンの頂点データが入力され、それを加工して、出力するものをいう。


概要

バーテックスシェーダーとピクセルシェーダーの2種類は基本中の基本であるため、シェーダーモデルを問わず、DirectXMonoGameUnityなどのプラットフォームも問わず扱えるはずである。

バーテックスシェーダー.png

バーテックスシェーダーは、バーテックスバッファおよびインデックスバッファで無駄を削がれた頂点データ群を入力として受け取る。

出力も頂点データ群である。この出力はジオメトリシェーダーに渡されてピクセル群に分解され、その後ピクセルシェーダーに渡される。なお、近年のパイプラインではバーテックスシェーダーの直後に「ハルシェーダー」「テッセレーター」「ドメインシェーダー」のテッセレーション三兄弟(実質3つで1つ)を経由することもある。

主な用途

主に服や草などが「なびく系」のアニメーションを行うのに用いられていることが多い。これらは物理演算エンジンで細かく計算してもいいが、たとえば草原の草を1本単位で物理演算するのはCPUでは論外、専用ハードウエアでも厳しい。そういった場面でそれらしく見せるのに使われる。

また、小難しいことをしない場合はバーテックスシェーダーはほとんど使われず、頂点データにカメラ座標を行列乗算(カメラから見た位置に変換)して出力することも多い。MonoGameのサンプルプログラムではモデルとカメラのジオメトリ変換CPUで計算していることが多いが、バーテックスシェーダーを使うとかなり速くなるよ。

頂点データの最適化

入力をそのまま出力するバーテックスシェーダーを用意して、そこにバーテックスバッファインデックスバッファを投げ込む。するとインデックスバッファと同じサイズに無駄を削がれたバーテックスバッファが得られる(インデックスが頂点座標に置き換えられたものが得られる)。

この無駄の削がれたバーテックスバッファを物理演算エンジンにぶち込みレイキャストを使った当たり判定に用いると結構いい感じになる。

なお、OpenGL ES系ではバーテックスバッファは書き込み一方通行であり読み出せないのでこの方法は使えない。あまり変化のない物体であればPC上のOpenGLDirectXでこの手法で無駄を削いだバーテックスバッファを事前に取得し、csvファイルなんかに保存しておき、iOSAndroidなどのOpenGL ES系のプラットフォームではそれを利用するという手もある。アプリ内での計算量も減るので高速化にもなる。

関連項目