Pixel Bender 3D カーネルの書き方

前回の記事で触れたように、Pixel Bender 3D がこのまま製品化される保証はありませんが、現時点で利用可能なシェーダを記述する手段の 1 つとして、引き続きご紹介を続けます。

今回は、実際に Pixel Bender 3D カーネルを記述する方法の概要です。

Pixel Bender 3D カーネルの基本構造

Pixel Bender 3D カーネルは、下に示すような構造をしています。頂点カーネル、マテリアルカーネル共に、基本的な構造は同じです。

<languageVersion: 1.0;>
vertex kernel カーネル名 
<
  カーネル メタデータ
>
{
  カーネル メンバー(変数と関数の定義)
}

最初の行は、記述する言語のバージョンを指定します。現時点では、ここは常に 1.0 です。

2 行目は、カーネルの定義の開始です。この行が vertex kernel で始まる場合は、頂点カーネルの定義という意味になります。マテリアルカーネルを定義する場合、この行は material kernel で始まります。

2 行目の最後のカーネル名は、カーネルを識別する名前になります。対になる頂点カーネルとマテリアルカーネルで、同じ名前を付けるのが良いようです。

3 行目以降は、カーネルのメタデータ & メンバーの定義が続きます。

カーネルメタデータ

メタデータの箇所には、以下の 3 行を記述します。これらは全て必須です。

<
  namespace: "Pixel Bender 3D example";
  vendor: "MyCompany";
  version: 1;
>

namespace は、カーネルが属するグループ名 (もしくはカテゴリ名) だと考えて良いようです。一般的な名前空間とは違って、ユニークな文字列である必要はありません。

vendor には、カーネルの提供者の名前、version には自然数を記述します。

必須ではありませんが、4 つ目のメタデータとして description も追加できます。メタデータにはカーネルを利用するアプリからアクセスできるため、アプリのヘルプ情報として表示するテキストを description 入れておくといった使い方ができます。その他、任意の名前のメタデータも記述できるようです。

以上がメタデータです。その下に続く、カーネルメンバーの箇所には、変数と関数の定義、つまり実際に実行されるロジックを記述します。

PB-ASM プログラムとカーネル変数の種類

話を進める前に、カーネルで使用する変数の種類について確認しておきます。

頂点カーネルとマテリアルカーネルから生成される PB-ASM プログラムには 3 種類ありました。

  • 頂点位置プログラム
  • 頂点マテリアルプログラム
  • 断片マテリアルプログラム

これらのプログラムで使われる変数には、以下の 6 種類があります。全てのプログラムが利用できる変数、特定のプログラムが利用する変数があります。

  1. parameter
    全てのプログラムから利用できる定数。座標変換用の行列などに使われ、シェーダを呼び出す前に ActionScript で設定する必要がある
  2. input vertex
    全てのプログラムから利用可能。頂点バッファからの座標や色等のデータ。プログラムで処理されると値が更新される
  3. input image
    断片マテリアルプログラムだけが利用できる。テクスチャデータ
  4. output
    頂点位置プログラムと断片マテリアルプログラムから利用できる。頂点位置プログラムの場合は変換後の頂点座標、断片マテリアルプログラムの場合は断片の色
  5. output vertex
    頂点位置プログラムから頂点マテリアルプログラムに渡す頂点情報
  6. interpolated
    頂点マテリアルプログラムから出力され、補間されて、断片マテリアルプログラムに渡される値

以上をプログラム単位でまとめ直すと以下のようになります。入力用と出力用の区別に注意して確認して下さい。

  • 頂点位置プログラム
    入力:parameter, input vertex
    出力:output, output vertex
  • 頂点マテリアルプログラム
    入力:parameter, input vertex
    出力:interpolated
  • 断片マテリアルプログラム
    入力:parameter, input image, interpolated
    出力:output

プログラム間の値の受け渡しについては、

  • 頂点位置プログラム output vertex → 頂点マテリアルプログラム input vertex
  • 頂点マテリアルプログラム interpolated → 断片マテリアルプログラム interpolated

となります。

また、最終的な出力として使われるデータは、

  • 頂点位置プログラムからの output
  • 断片マテリアルプログラムからの output

の 2 つです。

カーネルには、これらの変数が必要な数だけ定義されます。例えば parameter は 0 個かもしれませんし、3 個かもしれません。

頂点カーネルの変数定義

さて、いよいよ具体的に、カーネル変数を宣言する手段を認します。

下は、頂点カーネルの変数定義の例です。全部で 3 つの変数が定義されています。上から順に、parameter, input vector, output の変数です。

変数を定義する際は、変数の "種類 型 名前" の順に記述します。

{
  parameter float4x4 objectToClipSpaceTransform
<
id : "PB3D_CLIP_TRANSFORM";
>; input vertex float4 vertexPosition < id:"PB3D_POSITION"; >; output float4 vertexClipPosition; // 以下関数定義... }

float4 は float が 4 つのベクター型です。float4x4 は float 4 行 4 列の行列型です。

頂点カーネルで使用する 4 種類の変数のうち、output を除く parameter, input vertex, output vertex の変数を定義する場合は、下にメタデータとして id を指定します。

id の値は、予め決められたキーワードから選択します。

input vertex, output vertex の場合、主なキーワードには、以下のものがあります。

  • PB3D_POSITION : 頂点座標
  • PB3D_NORMAL : 法線
  • PB3D_COLOR : 頂点の色
  • PB3D_UV : 2 次元座標

parameter の場合は、

  • PB3D_CLIP_TRANSFORM : 座標変換行列

が定義されています。それ以外の定数に対する id の指定は不要です。

ということで、上の例に宣言された 3 つの変数は、順番に、以下のような意味だということが分かります。

  1. 座標変換用の行列を objectToClipSpaceTransform という名前で使用する
  2. 頂点バッファから float x 4 つ分を、頂点座標として vertexPosition という名前で使う
  3. 変換後の座標は vertexClipPosition という名前の変数に代入する

output vertex は、頂点カーネル内で頂点バッファのデータを変更しない場合は定義不要です。そのため上の頂点カーネルの例では宣言されていません。output の宣言は必須です。

次は、頂点カーネルの関数定義方法ですが、長くなりそうなので、次回に続きます。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/241

コメントする

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261