パッケージ | flash.display3D |
クラス | public final class Program3D |
継承 | Program3D Object |
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 2 |
Program3D オブジェクトで管理されるプログラムによって、Context3Dの drawTriangles()
の呼び出し時に三角形のレンダリング全体が制御されます。upload
メソッドを使用して、レンダリングコンテキストにバイナリバイトコードをアップロードします(アップロードすると、元のバイト配列のプログラムは参照されないので、元のバイト配列を変更したり破棄したりしてもプログラムは変更されません)。
プログラムは常に、頂点プログラムおよびフラグメントプログラムという 2 つの関連するプログラムから構成されます。
- 頂点プログラムは、VertexBuffer3D オブジェクトに定義されたデータを使用して、クリップスペースに頂点を投影して、カラーなどの必要な頂点データをフラグメントシェーダーに渡します。
- フラグメントシェーダーは、頂点プログラムから渡された属性を使用して、ラスタライズされた三角形のフラグメントごとにカラーを生成します。これが、ピクセルカラーになります。フラグメントプログラムには、フラグメントシェーダーやピクセルシェーダーなど、3D のプログラミング資料で使われる名前がいくつかあります。
Context3D の setProgram()
メソッドに、該当する Program3D インスタンスを渡して、後続のレンダリング操作に使用するプログラムペアを指定します。
Program3D オブジェクトを直接作成できないので、代わりに Context3D の createProgram()
メソッドを使用します。
関連する API エレメント
メソッド | 定義元 | ||
---|---|---|---|
このオブジェクトに関連付けられているすべてのリソースを解放します。 | Program3D | ||
オブジェクトに指定されたプロパティが定義されているかどうかを示します。 | Object | ||
Object クラスのインスタンスが、パラメーターとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。 | Object | ||
指定されたプロパティが存在し、列挙できるかどうかを示します。 | Object | ||
ループ処理に対するダイナミックプロパティの可用性を設定します。 | Object | ||
ロケール固有の規則に従って書式設定された、このオブジェクトのストリング表現を返します。 | Object | ||
指定されたオブジェクトのストリング表現を返します。 | Object | ||
AGAL(Adobe Graphics Assembly Language)バイトコードで表されるレンダリングプログラムのペアをアップロードします。 | Program3D | ||
指定されたオブジェクトのプリミティブな値を返します。 | Object |
dispose | () | メソッド |
public function dispose():void
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 3 |
このオブジェクトに関連付けられているすべてのリソースを解放します。Program3D オブジェクトを破棄すると、このオブジェクトを使用した upload() の呼び出しやレンダリングは失敗します。
upload | () | メソッド |
public function upload(vertexProgram:ByteArray, fragmentProgram:ByteArray):void
言語バージョン: | ActionScript 3.0 |
ランタイムバージョン: | Flash Player 11, AIR 3 |
AGAL(Adobe Graphics Assembly Language)バイトコードで表されるレンダリングプログラムのペアをアップロードします。
プログラムのバイトコードは、Pixel Bender 3D のオフラインツールを使用して作成できます。このバイトコードは、動的に作成することもできます。AGALMiniAssembler クラスは、AGAL アセンブリ言語プログラムを AGAL バイトコードにコンパイルするユーティリティクラスです。このクラスはランタイムの一部ではありません。シェーダープログラムをアップロードすると、バイトコードは現在のデバイス(OpenGL や Direct3D など)のネイティブのシェーダー言語にコンパイルされます。ランタイムではアップロード時にバイトコードが検証されます。
このプログラムは、Context3D の drawTriangles()
メソッドが呼び出されるたびに実行されます。頂点プログラムは、描画する三角形のリスト内の頂点ごとに 1 回実行されます。フラグメントプログラムは、三角形の面のピクセルごとに 1 回実行されます。
シェーダープログラムで使用される「変数」は「レジスタ」と呼ばれます。次のレジスタが定義されています。
名前 | フラグメントプログラムあたりの数 | 頂点プログラムあたりの数 | 用途 |
---|---|---|---|
Attribute | 該当せず | 8 | 頂点シェーダーの入力:Context3D.setVertexBufferAt() を使用して指定した頂点バッファーから読み取ります。 |
Constant | 28 | 128 | シェーダーの入力:Context3D.setProgramConstants() ファミリ関数を使用して設定します。 |
Temporary | 8 | 8 | 計算用の一時レジスタ(プログラム以外にアクセス不可) |
Output | 1 | 1 | シェーダーの出力:頂点プログラムの出力はクリップスペース位置で、フラグメントプログラムの出力はカラーです。 |
Varying | 8 | 8 | 頂点シェーダーとフラグメントシェーダー間で補間データを転送します。頂点プログラムの varying レジスタは、フラグメントプログラムへの入力として適用されます。値は、三角形の頂点からの距離に応じて補間されます。 |
Sampler | 8 | 該当せず | フラグメントシェーダーの入力:Context3D.setTextureAt() を使用して指定したテクスチャから読み取ります。 |
頂点プログラムは、頂点バッファーと constant レジスタの 2 つのソースから入力を受け取ります。Context3D の setVertexBufferAt()
メソッドを使用して、特定の頂点「attribute」レジスタに使用する頂点データを指定します。頂点属性には最大 8 個の入力レジスタを定義できます。頂点属性値は、三角形リストの頂点ごとに頂点バッファーから読み取られ、attribute レジスタに配置されます。Context3D の setProgramConstantsFromMatrix()
メソッドまたは setProgramConstantsFromVector()
メソッドを使用して、「constant」レジスタを指定します。constant レジスタは、三角形リストのすべての頂点に対して同じ値を保持します(drawTriangles()
の呼び出しと呼び出しの間の定数値のみを変更できます)。
頂点プログラムは、クリップスペース(x 軸と y 軸が ±1 で、z 軸が 0 ~ 1 以内の標準の表示領域)に三角形の頂点を投影し、変換された座標を output レジスタに配置します(通常、該当する投影マトリックスが一連の constant レジスタのシェーダーに提供されます)。また、頂点プログラムでは、フラグメントプログラムに必要なすべての頂点属性や計算値を、「varying」レジスタと呼ばれる特殊な変数セットにコピーする必要があります。フラグメントシェーダーを実行すると、varyingレジスタに提供される値は、各三角形の頂点から現在のフラグメントまでの距離に応じて、直線的に補間されます。
フラグメントプログラムでは、varying レジスタと個々の constant レジスタセット(setProgramConstantsFromMatrix()
または setProgramConstantsFromVector()
で設定)から入力を受け取ります。また、「sampler」レジスタを使用して、レンダリングコンテキストにアップロードされたテクスチャからテクスチャデータを読み取ることもできます。Context3D の setTextureAt()
メソッドを使用して、特定の sampler レジスタでアクセスするテクスチャを指定します。フラグメントプログラムは、カラー値に output レジスタを設定します。
パラメーター
vertexProgram:ByteArray — 頂点プログラムの AGAL バイトコード。ByteArray オブジェクトではリトルエンディアン形式を使用する必要があります。
| |
fragmentProgram:ByteArray — フラグメントプログラムの AGAL バイトコード。ByteArray オブジェクトではリトルエンディアン形式を使用する必要があります。
|
例外
TypeError — Null ポインターエラーです:vertexProgram または fragmentProgram が null の場合。
| |
Error — オブジェクトが破棄されました:Program3D オブジェクトが dispose() 呼び出しによって直接破棄されたか、Context3D dispose() 呼び出しによって間接的に破棄されたか、または、デバイス損失によりレンダリングコンテキストが破棄されたことが原因で Program3D オブジェクトが破棄された場合。
| |
ArgumentError — Agal プログラムが小さすぎます:いずれかのプログラムコード配列の長さが 31 バイトよりも短い場合。この長さは、1 個の命令で構成されるプログラムのシェーダーバイトコードのサイズです。
| |
ArgumentError — プログラムはリトルエンディアン形式である必要があります:いずれかのプログラムのバイトコード配列がリトルエンディアンでない場合。
| |
Error — ネイティブシェーダーのコンパイルに失敗しました:AGAL トランスレーターからの出力が、コンパイル可能なネイティブシェーダーの言語プログラムでない場合。このエラーは、リリース版プレーヤーでのみ発生します。
| |
Error — ネイティブシェーダーのコンパイルに失敗しました(OpenGL):AGAL トランスレーターからの出力が、コンパイル可能な OpenGL シェーダー言語プログラムではなく、コンパイル診断を含んでいる場合。このエラーは、デバッグ版プレーヤーでのみ発生します。
| |
Error — ネイティブシェーダーのコンパイルに失敗しました(D3D9):AGAL トランスレーターからの出力が、コンパイル可能な Direct3D シェーダー言語プログラムではなく、コンパイル診断を含んでいる場合。このエラーは、デバッグ版プレーヤーでのみ発生します。
AGAL バイトコード検証が失敗すると、次のエラーがスローされます。 | |
Error — AGAL プログラムではありません:ヘッダ-の「マジックバイト」が間違っている場合。バイトコードの最初のバイトは 0xa0 でなければなりません。このエラーは、バイト配列が誤ったエンディアンオーダーに設定されていることを示しています。
| |
Error — AGAL のバージョンが正しくありません:AGAL バージョンが現在の SWF バージョンでサポートされていない場合。SWF バージョン 13 の場合、AGAL バージョンを 1 に設定する必要があります。
| |
Error — AGAL のプログラムタイプが正しくありません:AGAL プログラムタイプの識別子が有効でない場合。バイトコードの 3 番目のバイトは 0xa1 でなければなりません。このエラーは、バイト配列が誤ったエンディアンオーダーに設定されていることを示しています。
| |
Error — AGAL のシェーダータイプが正しくありません:シェーダータイプコードがフラグメントでも頂点(1 または 0)でもない場合。
| |
Error — 範囲外の無効な AGAL オペコードです:トークンストリームに無効なオペコードがある場合。
| |
Error — 実装されていない無効な AGAL オペコードです:トークンストリームに無効なオペコードがある場合。
| |
Error — AGAL オペコードはフラグメントプログラムのみで許可されています:KIL や TEX などのフラグメントプログラムでのみ許可されているオペコードが、頂点プログラムのトークンストリーム内にある場合。
| |
Error — AGAL のソースオペランドが正しくありません:ソースオペランドが両方とも constant レジスタの場合。1 つの constant レジスタを使用して、シェーダープログラム以外の結果を計算し、渡す必要があります。
| |
Error — 両方のオペランドが間接読み取りです:オペランドが両方とも間接読み取りの場合。
| |
Error — オペコードのターゲットはすべて 0 でなければなりません:ターゲットがないオペコード(KIL など)を含むトークンが、ターゲットレジスタに 0 以外の値を指定している場合。
| |
Error — オペコードのターゲットはマスクを使用する必要があります:3 つのコンポーネント結果のみを生成するオペコードが、マスキングなしで使用されている場合。
| |
Error — トークンが多すぎます:AGAL プログラム内のトークン数が多すぎる(200 を超える)場合。
| |
Error — フラグメントシェーダータイプ:フラグメントプログラムのタイプ(fragmentProgram パラメーターの 6 番目のバイト)が 1 以外に設定されている場合。
| |
Error — 頂点シェーダータイプ:頂点プログラムのタイプ(vertexProgram パラメーターの 6 番目のバイト)が 0 以外に設定されている場合。
| |
Error — varying は読み取られますが書き込まれません:フラグメントシェーダーが、頂点シェーダーで書き込まれたことがない varying レジスタを読み取る場合。
| |
Error — varying は一部のみ書き込まれています:varyingレジスタが一部のみ書き込まれている場合。varying レジスタのすべてのコンポーネントを書き込む必要があります。
| |
Error — フラグメントはすべてのコンポーネントに書き込まれます:フラグメントのカラー出力が一部のみ書き込まれている場合。カラー出力の 4 つすべてのコンポーネントを書き込む必要があります。
| |
Error — 頂点はすべてのコンポーネントに書き込みます:頂点クリップスペース出力が一部のみ書き込まれている場合。頂点クリップスペース出力のすべてのコンポーネントを書き込む必要があります。
| |
Error — 使用されないオペランド:トークン内の未使用オペランドがすべてゼロに設定されていない場合。
| |
Error — sampler レジスタはフラグメントでのみ使用できます:sampler レジスタが頂点プログラムで使用されている場合。
| |
Error — sampler レジスタの第 2 オペランド:出力先または AGAL トークンの最初のオペランドとして sampler レジスタが使用されている場合。
| |
Error — 間接アドレスは頂点プログラムでのみ使用できます:フラグメントプログラムで間接アドレス指定が使用されている場合。
| |
Error — 間接アドレスは constant レジスタでのみ使用できます:constant 以外のレジスタで間接アドレス指定が使用されている場合。
| |
Error — 間接ソースタイプ:間接ソースタイプが attribute、constant、temporary レジスタ以外である場合。
| |
Error — 間接アドレスフィールドをゼロにする必要があります:直接アドレス指定時、ゼロになっていない間接アドレスフィールドがある場合。
| |
Error — varying レジスタはフラグメントプログラムでのみ読み取り可能です:頂点プログラムで varying レジスタの読み取りが実行されている場合。varying レジスタは、頂点プログラムでは書き込み専用、フラグメントプログラムでは読み取り専用です。
| |
Error — attribute レジスタは頂点プログラムでのみ読み取り可能です:フラグメントプログラムで attribute レジスタの読み取りが実行されている場合。attribute レジスタを読み取れるのは頂点プログラムのみです。
| |
Error — output レジスタの読み取りはできません:output レジスタ(位置またはカラー)の読み取りが実行されている場合。output レジスタは書き込み専用で、読み取ることはできません。
| |
Error — temporary レジスタに書き込まずに読み取りを実行しました:まだ書き込まれていない temporary レジスタの読み取りが実行されている場合。
| |
Error — temporary レジスタコンポーネントに書き込まずに読み取りを実行しました:まだ書き込まれていない特定の temporary レジスタコンポーネントの読み取りが実行されている場合。
| |
Error — sampler レジスタの書き込みはできません:sampler レジスタの書き込みが実行されている場合。sampler レジスタは読み取り専用で、書き込むことはできません。
| |
Error — varying レジスタの書き込みを実行しました:フラグメントプログラムで varying レジスタの書き込みが実行されている場合。varying レジスタは、頂点プログラムでは書き込み専用、フラグメントプログラムでは読み取り専用です。
| |
Error — attribute レジスタの書き込みはできません:attribute レジスタの書き込みが実行されている場合。attribute レジスタは読み取り専用です。
| |
Error — constant レジスタの書き込みはできません:シェーダープログラムで constant レジスタの書き込みが実行されている場合。
| |
Error — ターゲットの書き込みマスクがゼロです:ターゲットの書き込みマスクがゼロである場合。output レジスタのすべてのコンポーネントを設定する必要があります。
| |
Error — AGAL 予約済みビットはゼロにしてください:ゼロになっていない予約ビットがトークン内にある場合。これは、バイトコードの作成でエラーが発生した(またはバイトコードの形式に異常がある)ことを示します。
| |
Error — レジスタタイプが不明です:無効なレジスタタイプインデックスが使用されている場合。
| |
Error — 範囲外の sampler レジスタです:無効な sampler レジスタインデックスが使用されている場合。
| |
Error — 範囲外の varying レジスタです:無効な varying レジスタインデックスが使用されている場合。
| |
Error — 範囲外の attribute レジスタです:無効な attribute レジスタインデックスが使用されている場合。
| |
Error — 範囲外の constant レジスタです:無効な constant レジスタインデックスが使用されている場合。
| |
Error — 範囲外の output レジスタです:無効な output レジスタインデックスが使用されている場合。
| |
Error — 範囲外の temporary レジスタです:無効な temporary レジスタインデックスが使用されている場合。
| |
Error — 立方体マップサンプラーではクランプの使用が必須です:立方体マップサンプラーのラップモードがクランプに設定されていない場合。
| |
Error — サンプラーサイズが不明です:不明なサンプラーサイズがサンプルで使用されている場合(2D および立方体テクスチャのみがサポートされています)。
| |
Error — フィルターモードが不明です:サンプラーで不明なフィルターモードが使用されている場合(最も近い隣接および線形フィルタリングのみがサポートされています)。
| |
Error — ミップマップモードが不明です:サンプラーで不明なミップマップモードが使用されている場合(ミップマップなし、最も近い隣接、および線形ミップマップモードのみがサポートされています)。
| |
Error — 折り返しモードが不明です:サンプラーで不明な折り返しモードが使用されている場合(クランプおよび繰り返しの折り返しモードのみがサポートされています)。
| |
Error — 不明な特殊フラグです:サンプラーで不明な特殊フラグが使用されている場合。
| |
Error — 出力カラーにはマスクを使用できません:フラグメントプログラムでは、カラー output レジスタにマスクを適用することはできません。カラーレジスタのすべてのコンポーネントを設定する必要があります。
| |
Error — 第 2 オペランドに sampler レジスタを指定してください:AGAL tex オプコードに対しては、2 番目のオペランドで sampler を指定する必要があります。
| |
Error — 間接アドレス指定は許可されていません:許可されていないときに間接アドレス指定を使用した場合。
| |
Error — swizzle は scalar である必要があります:swizzle の指定エラー。
| |
Error — 第 2 ソースに対しては swizzle を指定できません:swizzle の指定エラー。
| |
Error — 2 回目の sampler 使用時には同じパラメーターを指定してください:同じテクスチャにアクセスする sampler は、サイズ設定、ラップ設定、フィルター設定、特殊設定、ミップマップ設定をすべて同じにする必要があります。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
|
詳細
関連する API エレメント
Tue Jun 12 2018, 10:34 AM Z