しゅみぷろスマートフォン用の表示で見るしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。GraphicsはじめにUnityでTessellationについて勉強したので基本的なところを纏めておきます。TessellationとはGPUを利用して頂点の分割を行う技術です。D3D10でのレンダリングパイプラインはMSDNより引用となっていました。場合はVertex-ShaderとPixel-Shaderを書いて...という感じでした。D3D11からはD3D10までの各パイプラインをサポートする他、追加のステージでTessellationを行うことが出来るようになっています。(ドメインシェーダー)上記の関数を用意するが必要になります。実際にTessellationを行うシンプルなコード実際にTessellationを行うコードです。}}はじめて見るとちょっと慣れない表記があったりと困惑しますが、順番に解説していきます。用語についてコード解説の前に、Tessellationで使われる用語についてです。詳しい解説は載ってないので誤って解釈している部分があるかもしれません。いうかあると思います。現在のパッチでどの程度頂点分割をかけるかという量を割り当てるという2つのことが必要になります。これらそれぞれを行う関数のことをMain-Hull-ShaderメインハルシェーダーPatch-Constant-Functionパッチ定数関数と呼びます(この2つの処理はハードウェアで並行して実行されます)。Main-Hull-Shaderはコントロールポイントごとに1回、Patch-Constant-Functionはパッチごとに1回実行されます。頂点データは、Tessellationを行う場合はObject-Spaceで与えるようにします。Stageに渡されます。Stageでは、これらの値を利用して実際に頂点が分割され、その出力をDomain-Shaderに渡します。Stageは固定機能なので、プログラマーが手を出す部分はありません。Patch-Constant-Function比較的理解が簡単なこちらから。Patch-Constant-Functionはパッチごとに、どの程度頂点を分割するかを決める係数を詰め込みます。基本的には係数を構造体に詰め込んで、次のステージであるTessellatorに渡すたけで、あとはTessellatorがその係数を見ながら頂点を分割してくれます。先程載せた実際にTessellationを行うシンプルなコードの中では、以下の抜粋した部分がPatch-Constant-Functionに該当します。}SV_TessFactor、SV_InsideTessFactorセマンティクスを持つ構造体h2d_constを定義して、そこに適当な値を詰め込む関数HSConstを定義しています。このセマンティクスを持つ値をTessellatorが解釈して分割を実行します。INPUT_PATCH_SIZE>は頂点シェーダーから出力された値がパッチ単位で入ったものです。INPUT_PATCH_SIZEはCGPROGRAMの先頭あたりで3という値にしています。これは1つのパッチが何個のコントロールポイントを持つかという値です。HSConstの出力h2d_constはTessellatorで分割に使われた後、Domain-Shaderに渡されるため、ここで渡された値はDomain-Shaderで参照できます。h2d_constでテッセレーション係数以外の任意の値を保持させて、頂点シェーダーから入力されたパッチデータを使って何か値を計算してDomain-Shaderで使うといったことも出来ます。注意点としては、分割に指定するドメインによって必要になる出力が変わってきます。今回のサンプルではドメインに三角形を指定していますが、それ以外の場合ではSV_InsideTessFactorを指定できないケースもあります。この場合エラーになるのですぐにわかると思います。Main-Hull-ShaderMain-Hull-Shaderはパッチのに対してコントロールポイントを割り当てて出力する関数です。Tessellationを行うシンプルなコードの中では、以下の抜粋した部分がMain-Hull-Shaderに該当します。}1つのコントロールポイントを出力するだけなので、出力用構造体はシンプルです。Patch-Constant-Functionの出力同様、Main-Hull-Shaderの出力もDomain-Shaderで参照できます。この例ではMain-Hull-Shader自体もかなりシンプルで、Vertex-Shaderから出力された位置情報をそのまま出力用の構造体に詰め込んで出力しているだけです。Main-Hull-Shaderについている属性はそれぞれdomainドメインの指定。(tri/quad/isoline)から選択。partitioning分割方法。(integer/fractional_eve,fractional_odd/pow2)から選択。outputtopology出力された頂点が形成するトポロジー。(point/line/triangle_cw/triangle_ccw)から選択。outputcontrolpoints出力されるコントロールポイント数(入力と違っても良い)。patchconstantfuncPatch-Constant-Functionを指定する。詳しくはこちら.aspx)のページを参照して下さい。Stageの出力をもとに、分割後の頂点を処理します。Geometry-Shaderを呼び出さない場合はここでWVP変換をする必要があります。DisplacementMapを利用して変位を与える処理などもここで記述できます。Tessellationを行うシンプルなコードの中では、以下の抜粋した部分がDomain-Shaderに該当します。}Domain-Shaderの出力用構造体は頂点位置のみ出力するようにしているので、とてもシンプルです。bary:SV_DomainLocationTessellatorによる分割後の頂点の位置を求めるためのパラメーターとなっています。Stageの出力は、分割後の頂点位置がそのまま出力されるわけではなく、このパラメーターを用いてDomain-Shader内で計算する必要があるため存在します。ドメインにtri(三角形)を指定しているため、SV_DomainLocationは三角形の重心座標を意味するパラメータになり、その型はfloat3になります。ドメインが異なると、SV_DomainLocationが意味する値と型が変わります。詳しくはMSDN.aspx)で。例では、パッチの各コントロールポイントと重心座標の値を計算して、WVP変換してその位置を出力しています。UnityでMatcapシェーダー書いたのでメモ。)はてなブログをはじめよう!es_programさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。