ピクセルベンダー Flash Playerのプログラミングのコンテキストでの言語仕様

ピクセルベンダー この記事は、Adobeの公式 Pixel Bender言語ドキュメントの無料翻訳です。 これは、Pixel Bender Developer's Guideではなく、Pixel Bender言語リファレンスの翻訳であることにすぐに注意したいと思います。 Googleがプロンプトとして、このトピックはまだRunetで明らかになっていないので、このような迷惑な省略を修正したいと思います)) Flash Playerのフィルターを書くことにのみ興味がありました。



Pixel Benderは、画像処理用に設計された高性能グラフィックプログラミングテクノロジーです。

Pixel Benderカーネルは、画像処理用の拡張機能を備えたCに似た言語です。 これはGLSLに基づいており、GLSLはCに基づいています。言語構文の基本は、Cプログラマーなら誰でも知っているはずです。

Pixel Benderの画像処理の基本単位はカーネルですこの単語をより正確に翻訳する方法がわからないため、Googleを信頼しました;))。 Pixel Benderの各プログラムは、1つのコアを定義します。 カーネルは、1つまたは複数のソース画像から取得できる任意の数の引数を持つ関数によって単一ピクセルを処理した結果を含むオブジェクトです。





Pixel Benderで作成されたフィルターの使用





アドビは、Pixel Bender言語でプログラムを作成するための統合開発環境であるPixel Bender Toolkit IDEを提供しています。 Pixel Bender Toolkit IDEの操作については、Pixel Bender開発者ガイドで説明されています( 注: Transl。IDEは無料です。Windowsバージョンはここから入手できます )。

開発中に、Pixel Bender Toolkit IDEでプログラムを実行できます。これにより、便利なインターフェイスが提供されます。 Pixel Bender Toolkit IDEの詳細については、Pixel Bender開発者ガイドを参照してください。

Flash Playerでフィルターを実行するには、ファイルを.pbj拡張子で保存する必要があります。

クライアントアプリケーションは、独自の方法で、フィルターの開始パラメーターと操作パラメーターへのアクセスを整理できます。





プリプロセッサディレクティブ





次のプリプロセッサディレクティブを使用できます(Cのプリプロセッサディレクティブと同様)。



#if

#ifdef

#defined

#endif

#elif

#define



Flash Playerは幅広い機器で実行されるため、Pixel Bender言語の一部のみがFlash Playerで使用できます。 以下は、Pixel Bender言語の使用に関してFlash Playerによって課せられた制限のリストです。







カーネル構文





Pixel Benderで記述された各プログラムは、山括弧で囲まれたメタデータのセットを含む1つのコードブロックと、中括弧で囲まれたカーネル、変数のセット、および実行される操作を説明する別のコードブロックを定義します。



<languageVersion : 1.0;>

kernel name

<

kernel metadata pairs

>

{

kernel members

}









各コアは、コードが記述されている言語のバージョンを示すことから始める必要があります。

カーネルの最初の部分は、山括弧で囲まれた名前と値のペアのグループで構成されるメタデータブロックを定義します。



<

name1 : value1;

name2 : value2;

...

>;









次のメタデータ値が事前定義されています。



名前空間 -必須。 カーネルが定義されている名前空間。

ベンダー -必須。 出版社

バージョン -必須。 整数、このカーネルの実装のバージョン番号。 これは、languageVersion(!)とは異なります。

説明 -オプション。 フィルターの説明。



例:



<

namespace : "Pixel Bender IDE";

vendor : "Adobe";

version : 1;

description: "A sample filter";

>









カーネル定義の2番目の部分は、中括弧で囲まれた変数と関数のセットです。 カーネルには少なくともevaluatePixel()関数の定義が含まれている必要があり、それ以外はすべてオプションです。



{

[declarations]

[support functions]

void evaluatePixel()

{

statements

}

}









通常、変数の宣言には、入力画像と出力画像のピクセルの宣言が含まれます。 関数で使用されるパラメーターと定数も含めることができます。

メイン関数のevaluatePixel()は 、画像または変換中の画像を入力するために使用され、単一ピクセルになります。

evaluatePixel()を定義する前に、以下をオプションで説明できます。



  1. パラメータ:



    parameter type name

    <

    name1 : value1;

    name2 : value2;

    ...

    >









    パラメータはカーネル関数内で読み取り専用です。 パラメータは、画像を除き、任意のタイプ(Flash Playerのフレームワーク内で使用可能)です。

  2. 定数:



    const type name=compile-time_expression;







    定数値はコンパイル時に決定されます。

  3. 入力:



    input type name;







    evaluatePixel()関数の引数として使用される画像。 そのタイプは、image1、image2、image3、またはimage4でなければなりません。

  4. 出力:



    output type name;







    evaluatePixel()関数の結果のピクセルのセット。 そのタイプは、pixel1、pixel2、pixel3、またはpixel4でなければなりません。







メタデータオプション





パラメーターには、このパラメーターを説明するデータを含めるか、その使用に制限を課すことができます。 このデータは、コンパイル後にクライアントアプリケーション内で利用可能になり、また、ユーザーがパラメーター値を設定できるようにするユーザーインターフェイスの設計方法をプログラマーが決定するのに役立ちます。

データ値は、パラメーターの宣言の後に山括弧で囲まれています。



parameter type name

<

name1 : value1;

name2 : value2;

...

>









名前は文字列です。 値は、有効なPixel Benderタイプの定数です。 int、float、およびbool型の場合、型の決定は自動的に行われます。 その他の型の場合、有効な型の定数値(たとえば、float2(1.0、-1.0))または二重引用符で区切られた文字列を決定する必要があります。 例:



parameter int angle

<

minValue : 0;

maxValue : 360;

defaultValue : 30;

description : "measured in degrees";

>;









このパラメーターは、可能な値を制限します。



minValue-最小許容値

maxValue-最大許容値

defaultValue-デフォルト値

description-クライアントアプリケーションでヒントとして使用できるパラメーターの説明。



カーネル関数の定義





カーネル関数の定義は、次の条件を満たす必要があります。



evaluatePixel()以外のすべてはオプションです。



関数の構文:



void evaluatePixel()

{

statements

}









ピクセルベンダー言語のデータ型





Pixel Benderは、強く型付けされた言語です。 自動型変換はありませんが、1つの例外があります。ベクトル浮動小数点データ型と行列データ型の間です。 データにはいくつかのタイプがあり、それぞれが特定の演算子と固有関数のセット内で定義されています。



Pixel Benderは、次の基本データ型をサポートしています。



bool-論理データ型

intは整数です

float-浮動小数点数

pixel1-1つの画像チャネルの値を定義します。 数字の「1」は、このデータ型とそれに似ていますが、いくつかの画像チャネルの値を定義しています。 このタイプのパレグナは浮動小数点数で表され、32ビットのメモリを占有します。



これらのデータ型はすべて数値演算に参加できます。



スカラーデータ型間の変換





bool、int、およびfloatデータ型は、通常のCスタイルのルールを使用して、相互に変換できます。



タイプ(式)



例:



int a = int(myfloat)







pixel1データ型は、floatデータ型と交換可能に使用できます。



注:



intデータ型は(符号に関係なく)16ビットのメモリを占有しますが、その実装は16ビット以上のメモリを占有できます。 int型とfloat型の間で変換を行うことができます。 intからfloatへの変換結果がintとして表現できない場合、変数の値は未定義になります。



ベクターデータタイプ





Pixel Benderは、スカラーデータ型ごとに2、3、および4要素のアナログをサポートしています。



float2 bool2 int2 pixel2

float3 bool3 int3 pixel3

float4 bool4 int4 pixel4



任意のタイプ(ピクセルを含む)の初期化は、一般的な形式で表されます。



vectorType(element1 [、element2 ...])



例:



float3(0.5, 0.6, 0.7)







簡略表記もあります(次の式は同等です)。



float3(0.3);

float3(0.3, 0.3, 0.3);









次の規則により、インデックスまたは名前でベクトル変数の値にアクセスできます。



  1. インデックス演算子を配列要素として使用する:



    vectorValue [インデックス]



  2. このシーケンスの要素にアクセスするためにドット表記を使用します



    r、g、b、a

    x、y、z、w

    s、t、p、q



    これらの各要素には、0〜3のインデックスがあります。





たとえば、myVectorValueベクトルの最初の要素の値を取得するには、次の書き込みオプションのいずれかを使用できます。



myVectorValue [0]

myVectorValue.r

myVectorValue.x

myVectorValue.s



アイテムの値を選択して上書きする





Pixel Benderは、スウィズリングをサポートして、ベクトル要素の順序を選択および再定義します。 n個の要素を持つベクトルの場合、値はポイント演算子の後に指定できます。 ベクトルの要素の対応する値は、割り当てられた変数と同じ数の要素を持つ新しい結果を形成します。 この構文を使用して、順序を変更したり、ベクトルの要素を削除または繰り返したりすることができます。 例:



float4 vec4;

float3 no_alpha = vec4.rgb; // vec4

float3 no_r = vec4.gba; // vec4

float4 reversed = vec4.abgr; //

float4 all_red = vec4.rrrr; //

float4 all_x = vec4.xxxx; //









個々のシーケンスからのポインターを組み合わせることはできません。



float4 vec4;

float3 no_alpha = vec4.rgz; // !









インデックスポインタは、割り当て式の左側にも適用できます。 この場合、インデックスを繰り返すことはできません。 この機能は、マスキングを記録するために使用されます( 注:オリジナルでは-書き込みマスキング)。 割り当て式の右側には、正しい数の引数が必要です。



float3 vec3;

float2 vec2;

vec3.xy = vec2; // vec2ベクトル要素の値を、インデックス0および1のvec3ベクトル要素に設定します

vec3.xz = vec2; // vec2ベクトル要素の値を、インデックス0および2のvec3ベクトル要素に設定します



相互作用:



スウィズリングとマスキングレコードは、割り当て式の両側で同時に使用できます。



vec3.xz = vec4.wy;







スウィズルと割り当ての間に合併症の可能性があります。 次の例を考えてみましょう。



g.yz *= g.yy;







このエントリの簡易バージョンは、次のように表すことができます。



gy *= gy;

gz *= gy;









問題は、2行目のgy値が変更されていることです。 正しい解決策は次のエントリです。



float2 temp = g.yz * g.yy;

g.yz = temp;









ベクターデータ型間の変換





代入オペランドのサイズが等しい場合、ベクトルデータ型間の変換は許容されます。 変換自体は、スカラーデータ型間の変換に似ています。



タイプ(式)



例:



float3 fvec3;

int3 ivec3;

fvec3 = float3(ivec3);









マトリックスタイプ





次のタイプのマトリックスが使用可能です。



float2x2

float3x3

float4x4



コンストラクターを使用してマトリックスを作成することは、マトリックスの値を示すためにフロートタイプのベクトルを使用すること、または各行の列要素またはフロートタイプのベクトルとスカラー変数の混合の順序で各マトリックス要素のフロートタイプのスカラー変数の値を指定することを意味します:



float2x2(float2、float2)



float2x2(float、float、

float、float)



float3x3(float3、float3、float3)



float3x3(float、float、float、

フロート、フロート、フロート、

float、float、float)



float4x4(float4、float4、float4、float4)



float4x4(float、float、float、float、

フロート、フロート、フロート、フロート、

フロート、フロート、フロート、フロート、

float、float、float、float)



float型の単一のスカラー変数の行列を初期化することもできます。これにより、主対角線上の行列の要素の値が決定されます。 他のすべての値はゼロに設定されます。



float2x2(フロート)

float3x3(フロート)

float4x4(フロート)



行列要素の値にアクセスするには、次の構文を使用します。



行列[列] [行]



シリーズの表示を省略すると、列全体が選択され、適切な次元のベクトル型の変数が返されます。



行列[列]



その他のデータ型





画像データの種類。



Pixel Benderは、画像タイプ変数もサポートしています。 これらは、次のデータ型で表されます。



image1

image2

image3

image4



型データ変数は、式で作成または使用できません。 ただし、これらは引数として言語の組み込み関数に渡すことができます。



データ型は無効です。



値を返さない関数は、void型で定義する必要があります。



オペレーター





Pixel Benderは、スカラーデータ型の算術演算に対して次のタイプの演算子を定義します。 ここでは、優先度順にリストしています。 ブラケットを使用して、この順序を変更できます。



。 可変アイテムの選択

++-後置インクリメントおよびデクリメント演算子

++-プレフィックスのインクリメントおよびデクリメント演算子

-! 単項否定演算子、論理「NOT」

* /乗算、除算

+-加算、減算

<> <=> =比較

==!=平等

&&論理「および」

^^論理的な「排他的OR」

|| 論理的な「OR」

= + =-= * = / =グループ化演算子

?:分岐ステートメントの簡単な記録。 この演算子は、式ではなく、2つの変数または定数(右側)から選択するためにのみ使用できます。



複数アイテムのデータ型操作





標準の算術演算子(+、-、*、/)は、ベクトルデータ型と行列データ型だけでなく、スカラーの演算にも使用できます。 2項演算子は、2つのベクトルオペランドが同じサイズの場合にのみ適用できます。 この場合、操作はベクトルの各要素に対して実行されます。 例:



float3 x、y、z;

z = x + y;



このエントリは次と同等です。



z [0] = x [0] + y [0];

z [1] = x [1] + y [1];

z [2] = x [2] + y [2];



スカラーとベクトルのペアのグループ化も許可されます。 例:



float3 x、y;

フロートw;

x = y * w;



このエントリは次と同等です。



x [0] = y [0] * w;

x [1] = y [1] * w;

x [2] = y [2] * w;



この規則の重要な例外は、行列自体と行列とベクトル変数との乗算です。 乗算は線形代数の規則に従って実行されます(コンポーネント単位ではありません):



float2x2 * float2x2線形代数の規則に従った行列の乗算

float3x3 * float3x3

float4x4 * float4x4



float2x2 * float2ベクトルによる列の乗算

float3x3 * float3

float4x4 * float4



float2 * float2x2ベクトルによるシリーズの乗算

float3 * float3x3

float4 * float4x4



組み込みのピクセルベンダー言語機能





数学関数:



算術演算子と同様に、数学関数はベクトルデータ型で実行できます。 この場合、コンポーネントごとに機能します。 特に指定がない限り、すべての角度はラジアンで示されます。



float radians(float degree)度をラジアンに変換します

float2ラジアン(float2度)

float3ラジアン(float3度)

float4ラジアン(float4度)



float度(floatラジアン)ラジアンを度に変換します

float2度(float2ラジアン)

float3度(float3ラジアン)

float4度(float4ラジアン)



float sin(floatラジアン)引数のサインを返します

float2 sin(float2ラジアン)

float3 sin(float3ラジアン)

float4 sin(float4ラジアン)



float cos(float radians)引数のコサインを返します

float2 cos(float2ラジアン)

float3 cos(float3ラジアン)

float4 cos(float4ラジアン)



float tan(floatラジアン)引数のタンジェントを返します。 x == pi / 2.0が未定義を返す場合

float2 tan(float2ラジアン)

float3 tan(float3ラジアン)

float4 tan(float4ラジアン)



float asin(float x)引数のアークサインを返します。 戻り値の範囲は[-pi / 2..pi / 2]です

float2 asin(float2 x)

float3 asin(float3 x)

float4 asin(float4 x)



float acos(float x)引数の逆余弦を返します。 戻り値の範囲は[0..pi]です

float2 acos(float2 x)

float3 acos(float3 x)

float4 acos(float4 x)



float atan(float y_over_x)引数のアークタンジェントを返します。 戻り値の範囲は[-pi / 2..pi / 2]です

float2 atan(float2 y_over_x)

float3 atan(float3 y_over_x)

float4 atan(float4 y_over_x)



float atan(float y、float x)式y / xのアークタンジェントを返します。 戻り値の範囲は[-pi..pi]です

float2 atan(float2 y、float2 x)

float3 atan(float3 y、float3 x)

float4 atan(float4 y、float4 x)



float pow(float x、float y)xのy乗を返し、x <0の場合は未定義

float2 pow(float2 x、float2 y)

float3 pow(float3 x、float3 y)

float4 pow(float4 x、float4 y)



float exp(float x)eのx乗を返します( 注レーン:この値の名前は覚えていません:))

float2 exp(float2 x)

float3 exp(float3 x)

float4 exp(float4 x)



float exp2(float x)2のx乗を返します

float2 exp2(float2 x)

float3 exp2(float3 x)

float4 exp2(float4 x)



float log(float x)xの自然対数を返します

float2ログ(float2 x)

float3ログ(float3 x)

float4ログ(float4 x)



float log2(float x)2を底とする数値xの自然対数を返します

float2 log2(float2 x)

float3 log2(float3 x)

float4 log2(float4 x)



float sqrt(float x)xの正の平方根を返し、x <0の場合は未定義

float2 sqrt(float2 x)

float3 sqrt(float3 x)

float4 sqrt(float4 x)



float inverseSqrt(float x)xの正の平方根の逆数を返し、x <0の場合は未定義

float2 inverseSqrt(float2 x)

float3 inverseSqrt(float3 x)

float4 inverseSqrt(float4 x)



float abs(float x)x> = 0の場合、xを返します。それ以外の場合は-xを返します

float2 abs(float2 x)

float3 abs(float3 x)

float4 abs(float4 x)



float sign(float x)x <0の場合、-1を返します

float2符号(float2 x)x == 0の場合、0を返します

float3符号(float3 x)x> 0の場合、1を返します

float4記号(float4 x)



float floor(float x)xを切り捨てます(整数を返します)

float2フロア(float2 x)

float3フロア(float3 x)

float4フロア(float4 x)



float ceil(float x)xを切り上げます(整数を返します)

float2 ceil(float2 x)

float3 ceil(float3 x)

float4 ceil(float4 x)



float fract(float x)x-floor(x)を返します

float2 fract(float2 x)

float3 fract(float3 x)

float4 fract(float4 x)



float mod(float x、float y)x-y * floor(x / y)を返します

float2 mod(float2 x、float2 y)

float3 mod(float3 x、float3 y)

float4 mod(float4 x、float4 y)



float min(float x、float y)x <yがxを返す場合、そうでなければyを返します

float2分(float2 x、float2 y)

float3分(float3 x、float3 y)

float4分(float4 x、float4 y)



float max(float x、float y)x> yの場合、xを返し、そうでない場合はyを返します

float2 max(float2 x、float2 y)

float3 max(float3 x、float3 y)

float4 max(float4 x、float4 y)



floatステップ(float x、float y)y <xの場合、0.0を返します。それ以外の場合は1.0を返します

float2ステップ(float2 x、float2 y)

float3ステップ(float3 x、float3 y)

float4ステップ(float4 x、float4 y)



float clamp(float x、float minval、float maxval)x <minvalの場合、minvalを返します。 x> maxvalの場合、maxvalを返します。 それ以外の場合、xを返します。

float2クランプ(float2 x、float2 minval、float2 maxval)

float3クランプ(float3 x、float3 minval、float3 maxval)

float4クランプ(float4 x、float4 minval、float4 maxval)



float mix(float x、float y、float a)x *(1.0-a)+ y * a(xとyの間の線形補間)を返します。

float2ミックス(float2 x、float2 y、float2 a)

float3ミックス(float3 x、float3 y、float3 a)

float4ミックス(float4 x、float4 y、float4 a)



float smoothStep(float edge0、float edge1、float x)x <= edge0の場合、0を返します。x> = edge1の場合、1を返します。それ以外の場合、スムーズ補間が実行されます( 注:元のスムーズエルミート補間)。

float2 smoothStep(float2 edge0、float2 edge1、float2 x)

float3 smoothStep(float3 edge0、float3 edge1、float3 x)

float4 smoothStep(float4 edge0、float4 edge1、float4 x)



幾何関数:



これらの関数は、オブジェクト全体としてベクトルを処理し、ベクトルの各要素を別個のものと見なしません。



float length(float x)ベクトルxの長さを返します

フロート長(float2 x)

フロート長(float3 x)

フロート長(float4 x)



float distance(float x、float y)xとyの間の距離を返します

フロート距離(float2 x、float2 y)

フロート距離(float3 x、float3 y)

フロート距離(float4 x、float4 y)



float dot(float x、float y)xとyのスカラー積を返します

floatドット(float2 x、float2 y)

floatドット(float3 x、float3 y)

floatドット(float4 x、float4 y)



float3 cross(vector3 x、vector3 y)xとyのベクトル積を返します



float normalize(float x)xと同じ方向のベクトルを返しますが、長さは1に等しく、長さ(x)== 0の場合は未定義です

float2正規化(float2 x)

float3正規化(float3 x)

float4正規化(float4 x)



これらの関数は、成分ごとの乗算を実行します(代数行列乗算を実行する*演算子とは対照的):



float2x2 matrixCompMult(float2x2 x、float2x2 y)xのyによる成分ごとの乗算を返します

float3x3 matrixCompMult(float3x3 x、float3x3 y)

float4x4 matrixCompMult(float4x4 x、float4x4 y)



これらの関数は、ベクトルをコンポーネントごとに比較し、同じ次元のブール値を返します(比較の順序を監視します)。



bool2 lessThan(int2 x、int2 y)展開された比較x <yを返します

bool3 lessThan(int3 x、int3 y)

bool4 lessThan(int4 x、int4 y)

bool2 lessThan(float2 x、float2 y)

bool3 lessThan(float3 x、float3 y)

bool4 lessThan(float4 x、float4 y)



bool2 lessThanEqual(int2 x、int2 y)展開された比較x <= yを返します

bool3 lessThanEqual(int3 x、int3 y)

bool4 lessThanEqual(int4 x、int4 y)

bool2 lessThanEqual(float2 x、float2 y)

bool3 lessThanEqual(float3 x、float3 y)

bool4 lessThanEqual(float4 x、float4 y)



bool2 greaterThan(int2 x、int2 y)展開された比較x> yを返します

bool3 greaterThan(int3 x、int3 y)

bool4 greaterThan(int4 x、int4 y)

bool2 greaterThan(float2 x、float2 y)

bool3 greaterThan(float3 x、float3 y)

bool4 greaterThan(float4 x、float4 y)



bool2 greaterThanEqual(int2 x、int2 y)展開された比較x> = yを返します

bool3 greaterThanEqual(int3 x、int3 y)

bool4 greaterThanEqual(int4 x、int4 y)

bool2 greaterThanEqual(float2 x、float2 y)

bool3 greaterThanEqual(float3 x、float3 y)

bool4 greaterThanEqual(float4 x、float4 y)



bool2 equal(int2 x、int2 y)展開された比較x == yを返します

bool3等しい(int3 x、int3 y)

bool4等しい(int4 x、int4 y)

bool2等しい(float2 x、float2 y)

bool3等しい(float3 x、float3 y)

bool4等しい(float4 x、float4 y)

bool2等しい(bool2 x、bool2 y)

bool3等しい(bool3 x、bool3 y)

bool4等しい(bool4 x、bool4 y)



bool2 notEqual(int2 x、int2 y)分解された比較x!= yを返します

bool3 notEqual(int3 x、int3 y)

bool4 notEqual(int4 x、int4 y)

bool2 notEqual(float2 x、float2 y)

bool3 notEqual(float3 x、float3 y)

bool4 notEqual(float4 x、float4 y)

bool2 notEqual(bool2 x、bool2 y)

bool3 notEqual(bool3 x、bool3 y)

bool4 notEqual(bool4 x、bool4 y)



これらの関数は論理型ベクトルでのみ機能します。



bool any(bool2 x)少なくとも1つの要素xが真の場合に真を返します

bool any(bool3 x)

bool any(bool4 x)



bool all(bool2 x)すべてのx要素がtrueの場合、trueを返します

bool all(bool3 x)

bool all(bool4 x)



bool2 not(bool2 x)ビットごとの論理否定の結果を返します

bool3 not(bool3 x)

bool4 not(bool4 x)



PS:これはHabréに関する私の最初の投稿です。 あまり蹴らないようにお願いします;)



All Articles