| パッケージ | flash.display3D |
| クラス | public final class Context3D |
| 継承 | Context3D EventDispatcher Object |
| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
レンダリングコンテキストには、描画面と、関連するリソースおよび状態が含まれます。可能であれば、レンダリングコンテキストでは、ハードウェアグラフィックスプロセッシングユニット(GPU)を使用します。これを使用できない場合、レンダリングコンテキストではソフトウェアを使用します(Context3D を使用したレンダリングがプラットフォームでサポートされていない場合は、Stage オブジェクトの stage3Ds プロパティに空のリストが含まれます)。
Context3D レンダリングコンテキストは、OpenGL ES 2 に非常によく似たプログラム可能なパイプラインですが、ハードウェアおよび GPU の様々なインターフェイスとの互換性を保つために抽象化されます。3D グラフィック用にデザインされているものの、レンダリングパイプラインでは、レンダリングが 3 次元であることは要求されません。したがって、適切な頂点およびピクセルのフラグメントプログラムを指定することにより、2D レンダラーを作成できます。3D、2D いずれの場合も、サポートされている幾何プリミティブは三角形だけです。
Stage3D オブジェクトの requestContext3D() メソッドを呼び出して、Context3D クラスのインスタンスを取得します。Context3D オブジェクトの数はステージごとに制限されており、Stage.stage3Ds リスト内の Stage3D ごとに 1 つだけです。コンテキストが作成されると、Stage3D オブジェクトでは context3DCreate イベントが送出されます。レンダリングコンテキストは、GPU を使用する別のアプリケーションがフォーカスされたときなど、いつでも破棄して再作成できます。context3DCreate イベントを複数受け取ることを想定してコードを作成する必要があります。関連する Stage3D インスタンスの x および y プロパティを使用して、ステージにレンダリング領域を位置付けます。
シーンをレンダリングして表示(Context3D オブジェクトを取得後)する場合の標準的な手順は次のとおりです。
-
configureBackBuffer()を呼び出して、メインの表示バッファー属性を設定します。 - 以下を含むレンダリングリソースを作成して初期化します。
- シーンのジオメトリを定義する頂点およびインデックスのバッファー
- シーンをレンダリングするための頂点およびピクセルのプログラム(シェーダー)
- テクスチャ
- フレームをレンダリングします。
- シーン内のオブジェクトまたはオブジェクトのコレクションに合わせてレンダリング状態を設定します。
-
drawTriangles()メソッドを呼び出して一連の三角形をレンダリングします。 - 次のオブジェクトグループ用にレンダリング状態を変更します。
-
drawTriangles()を呼び出して、オブジェクトを定義する三角形を描画します。 - シーン全体がレンダリングされるまで、この手順を繰り返します。
-
present()メソッドを呼び出して、レンダリングされたシーンをステージに表示します。
レンダリングには次の制限が適用されます。
リソースの制限:
| リソース | 数の上限 | メモリ合計 |
|---|---|---|
Vertex buffers
| 4096 | 256 MB |
Index buffers
| 4096 | 128 MB |
Programs
| 4096 | 16 MB |
Textures
| 4096 | 128 MB |
Cube textures
| 4096 | 256 MB |
AGAL の制限:プログラムあたりオペコード 200 個まで。
描画の呼び出しの制限:present() 呼び出し 1 回につき drawTriangles() 呼び出し 32,768 回まで。
テクスチャには次の制限が適用されます。
AIR 32 ビットのテクスチャの制限:
| Texture | 最大サイズ | GPU メモリの合計量 |
|---|---|---|
標準テクスチャ(ベースライン拡張以下)
| 2048 x 2048 | 512 MB |
標準テクスチャ(ベースライン拡張以上)
| 4096 x 4096 | 512 MB |
矩形テクスチャ(ベースライン拡張以下)
| 2048 x 2048 | 512 MB |
矩形テクスチャ(ベースライン拡張以上)
| 4096 x 4096 | 512 MB |
立方体テクスチャ
| 1024 x 1024 | 256 MB |
AIR 64 ビットのテクスチャの制限(デスクトップ):
| Texture | 最大サイズ | GPU メモリの合計量 |
|---|---|---|
標準テクスチャ(ベースライン拡張以下)
| 2048 x 2048 | 512 MB |
標準テクスチャ(ベースライン拡張から標準)
| 4096 x 4096 | 512 MB |
標準テクスチャ(標準の拡張以上)
| 4096 x 4096 | 2048 MB |
矩形テクスチャ(ベースライン拡張以下)
| 2048 x 2048 | 512 MB |
矩形テクスチャ(ベースライン拡張から標準)
| 4096 x 4096 | 512 MB |
矩形テクスチャ(標準の拡張以上)
| 4096 x 4096 | 2048 MB |
立方体テクスチャ
| 1024 x 1024 | 256 MB |
512 MB がテクスチャの絶対限界です(ミップマップに必要なテクスチャメモリを含む)。ただし、立方体テクスチャの場合、メモリの上限は 256 MB です。
Context3D コンストラクターで Context3D オブジェクトを作成することはできません。Stage3D インスタンスのプロパティとして作成し、使用できます。Context3D クラスは、Flash Player と AIR のどちらで実行している場合でも、デスクトッププラットフォームとモバイルプラットフォームの両方で使用できます。
関連する API エレメント
Context3DClearMask
Context3DCompareMode
Context3DProgramType
Context3DRenderMode
Context3DStencilAction
Context3DTextureFormat
Context3DTriangleFace
Context3DVertexBufferFormat
flash.display3D.textures.Texture
flash.display3D.textures.CubeTexture
IndexBuffer3D
flash.geom.Matrix3D
Program3D
flash.display.Stage3D
VertexBuffer3D
| プロパティ | 定義元 | ||
|---|---|---|---|
| backBufferHeight : int [読み取り専用]
バックバッファーの高さを指定します。これは、configureBackBuffer() を正常に呼び出すことで変更できます。 | Context3D | ||
| backBufferWidth : int [読み取り専用]
バックバッファーの幅を指定します。これは、configureBackBuffer() を正常に呼び出すことで変更できます。 | Context3D | ||
![]() | constructor : Object
指定されたオブジェクトインスタンスのクラスオブジェクトまたはコンストラクター関数への参照です。 | Object | |
| driverInfo : String [読み取り専用]
このレンダリングコンテキストで使用されるグラフィックスライブラリドライバーのタイプです。 | Context3D | ||
| enableErrorChecking : Boolean
レンダラーで発生したエラーをアプリケーションに報告するかどうかを指定します。 | Context3D | ||
| maxBackBufferHeight : int
バックバッファーの高さの最大値を指定します。 | Context3D | ||
| maxBackBufferWidth : int
バックバッファーの幅の最大値を指定します。 | Context3D | ||
| profile : String [読み取り専用]
この Context3D オブジェクトによって使用中の、機能サポートプロファイルです。 | Context3D | ||
| supportsVideoTexture : Boolean [静的] [読み取り専用]
Context3D がビデオテクスチャをサポートしているかどうかを示します。 | Context3D | ||
| totalGPUMemory : Number [読み取り専用]
アプリケーションの Stage3D データ構造により割り当てられた GPU メモリの合計が返されます。GPU リソースオブジェクトが作成されるたびに、使用されるメモリが Context3D に格納されます。 | Context3D | ||
| メソッド | 定義元 | ||
|---|---|---|---|
![]() | addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
イベントリスナーオブジェクトを EventDispatcher オブジェクトに登録し、リスナーがイベントの通知を受け取るようにします。 | EventDispatcher | |
clear(red:Number = 0.0, green:Number = 0.0, blue:Number = 0.0, alpha:Number = 1.0, depth:Number = 1.0, stencil:uint = 0, mask:uint = 0xffffffff):void
この Context3D オブジェクトに関連付けられている色、深度およびステンシルのバッファーをクリアして、指定した値を入力します。 | Context3D | ||
configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void
レンダリングバッファーのビューポイントのサイズおよびその他の属性を設定します。 | Context3D | ||
createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture
CubeTexture オブジェクトを作成します。 | Context3D | ||
IndexBuffer3D オブジェクトを作成します。 | Context3D | ||
Program3D オブジェクトを作成します。 | Context3D | ||
createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture
Rectangle Texture オブジェクトを作成します。 | Context3D | ||
createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture
Texture オブジェクトを作成します。 | Context3D | ||
createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
VertexBuffer3D オブジェクトを作成します。 | Context3D | ||
createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D
インスタンスデータの VertexBuffer3D オブジェクトを作成します。 | Context3D | ||
VideoTexture オブジェクトを作成します。 | Context3D | ||
![]() |
イベントをイベントフローに送出します。 | EventDispatcher | |
この Context3D に関連付けられているすべてのリソースおよび内部記憶領域を開放します。 | Context3D | ||
ビットマップに現在のレンダリングバッファーを描画します。 | Context3D | ||
現在のバッファーと、この Context3D オブジェクトの状態を使用して、指定した三角形をレンダリングします。 | Context3D | ||
drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void
現在のバッファーと、この Context3D オブジェクトの状態を使用して、指定したインスタンス化済みの三角形をレンダリングします。 | Context3D | ||
![]() |
EventDispatcher オブジェクトに、特定のイベントタイプに対して登録されたリスナーがあるかどうかを確認します。 | EventDispatcher | |
![]() |
オブジェクトに指定されたプロパティが定義されているかどうかを示します。 | Object | |
![]() |
Object クラスのインスタンスが、パラメーターとして指定されたオブジェクトのプロトタイプチェーン内にあるかどうかを示します。 | Object | |
バックレンダリングバッファーを表示します。 | Context3D | ||
![]() |
指定されたプロパティが存在し、列挙できるかどうかを示します。 | Object | |
![]() |
EventDispatcher オブジェクトからリスナーを削除します。 | EventDispatcher | |
既存のカラーによる描画処理の出力カラーをブレンドするために使用する係数を指定します。 | Context3D | ||
カラーをレンダリングバッファーに書き込む際に使用するマスクを設定します。 | Context3D | ||
三角形カリングモードを設定します。 | Context3D | ||
深度のテストに使用する比較のタイプを設定します。 | Context3D | ||
レンダリングで使用される塗りモードを設定します。 | Context3D | ||
後続のレンダリングに使用する頂点シェーダープログラムおよびフラグメントシェーダープログラムを設定します。 | Context3D | ||
setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void
ByteArray に保存された値を使用するシェーダープログラムで必要となる定数を設定します。 | Context3D | ||
setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void
Matrix3D に保存された値を使用して、シェーダープログラムで必要となる定数を設定します。 | Context3D | ||
setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void
シェーダープログラムの定数の入力を設定します。 | Context3D | ||
![]() |
ループ処理に対するダイナミックプロパティの可用性を設定します。 | Object | |
レンダリングターゲットとしてバックレンダリングバッファーを設定します。 | Context3D | ||
setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void
レンダリングターゲットとして指定されたたテクスチャを設定します。 | Context3D | ||
テクスチャサンプラーの状態を手動でオーバーライドします。 | Context3D | ||
シザー矩形(描画マスクの一種)を設定します。 | Context3D | ||
setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void
ステンシルモードおよびステンシル操作を設定します。 | Context3D | ||
ステンシルのテストで使用するステンシル比較値を設定します。 | Context3D | ||
フラグメントプログラムのテクスチャ入力レジスタに使用するテクスチャを指定します。 | Context3D | ||
setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void
単一の頂点シェーダープログラムの入力に対応する頂点データコンポーネントを指定します。 | Context3D | ||
![]() |
ロケール固有の規則に従って書式設定された、このオブジェクトのストリング表現を返します。 | Object | |
![]() |
指定されたオブジェクトのストリング表現を返します。 | Object | |
![]() |
指定されたオブジェクトのプリミティブな値を返します。 | Object | |
![]() |
指定されたイベントタイプについて、この EventDispatcher オブジェクトまたはその祖先にイベントリスナーが登録されているかどうかを確認します。 | EventDispatcher | |
backBufferHeight | プロパティ |
backBufferHeight:int [読み取り専用] | 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 15, AIR 15 |
バックバッファーの高さを指定します。これは、configureBackBuffer() メソッドを正常に呼び出すことで変更できます。configureBackBuffer() メソッドの最後の正常な呼び出しで wantsBestResolutionOnBrowserZoom が true に設定されていれば、ブラウザーのズーム率が変更されたときに高さを変更できます。ブラウザーのズーム変更イベントのイベントリスナーを登録することで、高さの変更を検出できます。
実装
public function get backBufferHeight():int関連する API エレメント
backBufferWidth | プロパティ |
backBufferWidth:int [読み取り専用] | 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 15, AIR 15 |
バックバッファーの幅を指定します。これは、configureBackBuffer() メソッドを正常に呼び出すことで変更できます。configureBackBuffer() メソッドの最後の正常な呼び出しで wantsBestResolutionOnBrowserZoom が true に設定されていれば、ブラウザーのズーム率が変更されたときに幅を変更できます。ブラウザーのズーム変更イベントのイベントリスナーを登録することで、幅の変更を検出できます。
実装
public function get backBufferWidth():int関連する API エレメント
driverInfo | プロパティ |
driverInfo:String [読み取り専用] | 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
このレンダリングコンテキストで使用されるグラフィックスライブラリドライバーのタイプです。ソフトウェア、DirectX ドライバー、OpenGL ドライバーのいずれがレンダリングに使用されるかを示します。また、ハードウェアレンダリングが失敗したかも示します。ハードウェアレンダリングが失敗した場合、Flash Player は Stage3D に対してソフトウェアレンダリングを使用し、driverInfo に次のいずれかの値が含まれます。
- "Software Hw_disabled=userDisabled":Adobe Flash Player 設定 UI の「ハードウェアアクセラレーションを有効化」チェックボックスが選択されていません。
- "Software Hw_disabled=oldDriver":ハードウェアグラフィックドライバーで既知の問題が発生しています。グラフィックドライバーをアップデートすることでこの問題が解決する場合があります。
- "Software Hw_disabled=unavailable":ハードウェアグラフィックドライバーで既知の問題が発生したか、ハードウェアグラフィックの初期化に失敗しました。
- "Software Hw_disabled=explicit":コンテンツから requestContext3D 経由でソフトウェアレンダリングが明示的に要求されました。
- "Software Hw_disabled=domainMemory" - コンテンツは、Stage3D ハードウェアレンダリングで使用する場合にライセンスが必要な domainMemory を使用します。adobe.com/go/fpl_jp を参照してください。
実装
public function get driverInfo():StringenableErrorChecking | プロパティ |
enableErrorChecking:Boolean| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
レンダラーで発生したエラーをアプリケーションに報告するかどうかを指定します。
enableErrorChecking が true のとき、clear() メソッドと drawTriangles() メソッドは同期状態であり、エラーがスローされる場合があります。enableErrorChecking が false のとき(デフォルト)、clear() メソッドと drawTriangles() メソッドは非同期状態であり、エラーは報告されません。エラーチェックを有効にすると、レンダリングのパフォーマンスが低下します。エラーチェックはデバッグ時にのみ有効にしてください。
実装
public function get enableErrorChecking():Boolean public function set enableErrorChecking(value:Boolean):void関連する API エレメント
maxBackBufferHeight | プロパティ |
maxBackBufferHeight:int| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 15, AIR 15 |
バックバッファーの高さの最大値を指定します。初期値は、プラットフォームのシステムの制限値です。 プロパティにはシステムの制限値以下の値を設定できますが、これより大きい値は設定できません。プロパティにはシステムの制限値以上の値を設定できますが、これより小さい値は設定できません。バックバッファーが設定されていない場合の最小限度は 定数 32 です。最小限度は、バックバッファーが設定された後、configureBackBuffer() メソッドの最後の正常な呼び出しにおける高さパラメーターの値となります。
実装
public function get maxBackBufferHeight():int public function set maxBackBufferHeight(value:int):voidmaxBackBufferWidth | プロパティ |
maxBackBufferWidth:int| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 15, AIR 15 |
バックバッファーの幅の最大値を指定します。初期値は、プラットフォームのシステムの制限値です。 プロパティにはシステムの制限値以下の値を設定できますが、これより大きい値は設定できません。プロパティにはシステムの制限値以上の値を設定できますが、これより小さい値は設定できません。バックバッファーが設定されていない場合の最小限度は 定数 32 です。最小限度は、バックバッファーが設定された後、configureBackBuffer() メソッドの最後の正常な呼び出しにおける幅パラメーターの値となります。
実装
public function get maxBackBufferWidth():int public function set maxBackBufferWidth(value:int):voidprofile | プロパティ |
supportsVideoTexture | プロパティ |
totalGPUMemory | プロパティ |
totalGPUMemory:Number [読み取り専用] | 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 21, AIR 21 |
アプリケーションの Stage3D データ構造により割り当てられた GPU メモリの合計が返されます。
GPU リソースオブジェクトが作成されるたびに、使用されるメモリが Context3D に格納されます。このメモリには、この Context3D により作成されたインデックスバッファー、頂点バッファー、テクスチャ(ビデオのテクスチャは除く)およびプログラムが含まれます。
API totalGPUMemory は、上記のリソースで消費されたメモリの合計をユーザーに返します。デフォルト値として 0 が返されます。GPU メモリの合計はバイト単位で返されます。この情報は、モバイルではダイレクトモードでのみ、デスクトップではダイレクトおよび GPU モードで提供されます。(デスクトップでは、<renderMode>gpu</renderMode> を使用すると、<renderMode>direct</renderMode> にフォールバックされます)
実装
public function get totalGPUMemory():Numberclear | () | メソッド |
public function clear(red:Number = 0.0, green:Number = 0.0, blue:Number = 0.0, alpha:Number = 1.0, depth:Number = 1.0, stencil:uint = 0, mask:uint = 0xffffffff):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
この Context3D オブジェクトに関連付けられている色、深度およびステンシルのバッファーをクリアして、指定した値を入力します。
mask パラメーターを設定して、クリアするバッファーを指定します。Context3DClearMask クラスで定義されている定数を使用して mask パラメーターを設定します。ビット単位の OR 演算子「|」を使用して、複数のバッファーをマスクに追加します(または Context3DClearMask.ALL を使用します)。バックバッファーにレンダリングする場合、clear() を呼び出す前に、configureBackBuffer() メソッドを呼び出す必要があります。
注意:許可されている範囲外のパラメーター値を指定した場合、Numeric パラメーターの値は、通知なしで 0 ~ 1 の範囲に強制的に設定されます。同様に、stencil に 0xff を超える値が指定された場合、0xff が設定されます。
パラメーター
red:Number (default = 0.0) — カラーバッファーをクリアする赤色成分(0 ~ 1)。
| |
green:Number (default = 0.0) — カラーバッファーをクリアする緑色成分(0 ~ 1)。
| |
blue:Number (default = 0.0) — カラーバッファーをクリアする青色成分(0 ~ 1)。
| |
alpha:Number (default = 1.0) — カラーバッファーをクリアするアルファ成分(0 ~ 1)。アルファ成分は、ブレンドには使用されません。バッファーアルファに直接書き込まれます。
| |
depth:Number (default = 1.0) — 深度バッファーをクリアする値(0 ~ 1)。
| |
stencil:uint (default = 0) — ステンシルバッファーをクリアする 8 bit の値(0x00 ~ 0xff)。
| |
mask:uint (default = 0xffffffff) — どのバッファーをクリアするかを指定します。
|
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
|
関連する API エレメント
configureBackBuffer | () | メソッド |
public function configureBackBuffer(width:int, height:int, antiAlias:int, enableDepthAndStencil:Boolean = true, wantsBestResolution:Boolean = false, wantsBestResolutionOnBrowserZoom:Boolean = false):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
レンダリングバッファーのビューポイントのサイズおよびその他の属性を設定します。
レンダリングは二重バッファーです。バックバッファーは、present() メソッドを呼び出したときに、表示されているフロントバッファーと入れ替わります。バッファーの最低サイズは 32x32 ピクセルです。バックバッファーの最大サイズは、デバイスの機能によって制限され、maxBackBufferWidth および maxBackBufferHeight プロパティを使用してユーザーが設定することもできます。バッファーの構成は低速な操作です。通常のレンダリング操作時は、バッファーのサイズや属性の変更は避けてください。
パラメーター
width:int — バッファーの幅(ピクセル単位)。
| |||||||||
height:int — バッファーの高さ(ピクセル単位)。
| |||||||||
antiAlias:int — 要求されたアンチエイリアスの品質を指定する整数値。この値は、アンチエイリアスの際に使用するサブサンプルの数と相関します。使用するサブサンプルの数を増やすと、必要な計算量も増えます。ただし、相対的なパフォーマンスへの影響は、レンダリングハードウェアによって異なります。アンチエイリアスのタイプと、アンチエイリアスが実際に実行されるかどうかは、デバイスとレンダリングモードによって決まります。ソフトウェアレンダリングコンテキストによるアンチエイリアスは一切サポートされていません。
| |||||||||
enableDepthAndStencil:Boolean (default = true) — false の場合、深度およびステンシルバッファーは作成されません。true の場合、深度およびステンシルバッファーは作成されます。SWF 15 以降のバージョンでコンパイルされた AIR 3.2 以降のアプリケーションで、アプリケーション記述ファイルの renderMode エレメントが direct の場合、アプリケーション記述ファイルの depthAndStencil エレメントの値がこの引数の値と一致している必要があります。デフォルトでは、depthAndStencil エレメントの値は false です。
| |||||||||
wantsBestResolution:Boolean (default = false) — true は、デバイスが HiDPI スクリーンをサポートしている場合に width および height パラメーターで指定されているより大きなバックバッファーを割り当てようとしていることを示します。これは多くのピクセルを追加し、潜在的にシェーダー操作の結果を変更するので、デフォルトではオフになっています。ネイティブのバックバッファーがどれくらい増加したかによって、Stage.contentsScaleFactor を使用して決定します。
| |||||||||
wantsBestResolutionOnBrowserZoom:Boolean (default = false) — true は、ブラウザーのズーム率の増加に比例してバックバッファーのサイズが増加することを示します。この値の設定は、複数のブラウザーのズームで持続されます。パラメーターのデフォルト値は false です。バックバッファーのサイズの上限を制限するには、maxBackBufferWidth および maxBackBufferHeight プロパティを設定します。バックバッファーの現在のサイズを特定するには、backBufferWidth および backBufferHeight を使用します。
|
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — 入力サイズが正しくありません:width または height のパラメーターがバックバッファーの最小サイズよりも小さいか、バックバッファーの最大サイズよりも大きい場合。
| |
Error — 3709:アプリケーション記述子の depthAndStencil フラグは、Context3D オブジェクトの configureBackBuffer() に渡される enableDepthAndStencil ブール値と一致する必要があります。
|
createCubeTexture | () | メソッド |
public function createCubeTexture(size:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:CubeTexture| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
CubeTexture オブジェクトを作成します。
CubeTexture オブジェクトを使用して、レンダリングコンテキストに立方体テクスチャビットマップをアップロードし、レンダリング時に立方体テクスチャを参照します。立方体テクスチャは 6 つの同一サイズの四角形テクスチャを立方体のトポロジーに配置したもので、環境マップを表現する場合に便利です。
CubeTexture コンストラクターで CubeTexture オブジェクトを作成できないので、代わりにこのメソッドを使用します。CubeTexture オブジェクトを作成したら、CubeTexture の uploadFromBitmapData()、uploadFromByteArray() または uploadCompressedTextureFromByteArray() メソッドを使用して、テクスチャのビットマップデータをアップロードします。
パラメーター
size:int — テクスチャのエッジの長さ(テクセル単位)。
| |
format:String — Context3DTextureFormat の列挙リスト(テクセル形式)。
テクスチャの圧縮では、テクスチャのイメージを圧縮形式で GPU に直接保存することにより、GPU のメモリとメモリ帯域幅の消費を抑えることができます。通常、圧縮テクスチャはオフラインで圧縮され、Texture.uploadCompressedTextureFromByteArray メソッドを使用して圧縮形式で GPU にアップロードされます。デスクトッププラットフォーム上の Flash Player 11.4 および AIR 3.4 では、ランタイムのテクスチャ圧縮がサポートされています。この機能は、ベクターアートから動的テクスチャをレンダリングするなどの場合に便利です。ただし、この機能は現在モバイルプラットフォームでは使用できず、ArgumentError(テクスチャ形式が一致しません)がスローされます。ランタイムのテクスチャ圧縮を使用するには、以下の手順を実行します。1. Context3D.createCubeTexture() メソッドを呼び出してテクスチャオブジェクトを作成し、format パラメーターとして flash.display3D.Context3DTextureFormat.COMPRESSED または flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA のどちらかを渡します。2. createCubeTexture() によって返された flash.display3D.textures.Texture インスタンスを使用して、flash.display3D.textures.CubeTexture.uploadFromBitmapData() または flash.display3D.textures.CubeTexture.uploadFromByteArray() のどちらかを呼び出し、テクスチャのアップロードと圧縮を一度に行います。 | |
optimizeForRenderToTexture:Boolean — テクスチャをレンダリングのターゲットとして使用する可能性がある場合は、true に設定します。
| |
streamingLevels:int (default = 0) — 画像をレンダリングする前にロードする必要のある MIP マップレベル。テクスチャストリーミングを使用すると、最も小さいミップレベルからロードして表示し、テクスチャのロード時に高品質の画像をプログレッシブに表示することができます。高画質の画像がロードされる間、エンドユーザーは低画質の画像を表示できます。
デフォルトの streamingLevels は 0 です。0 は、画像をレンダリングする前に MIP マップ内の最高画質の画像をロードする必要があることを表します。このパラメーターは Flash Player 11.3 および AIR 3.3 で追加されました。これらより前のバージョンの Flash Player および AIR の動作を維持するには、デフォルト値を使用してください。
注意:このプロパティを 0 より大きい値に設定すると、メモリ使用量とパフォーマンスに影響を及ぼすことがあります。 |
flash.display3D.textures:CubeTexture |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの Texture オブジェクトが作成されたか、テクスチャに割り当てられたメモリの容量を超過した場合。
| |
ArgumentError — 深度テクスチャはまだ実装されていません:深度テクスチャを作成しようとした場合。
| |
ArgumentError — テクスチャのサイズがゼロです:size パラメーターが 0 以下の場合。
| |
ArgumentError — テクスチャのサイズが 2 の累乗ではありません:size パラメーターが 2 の累乗ではない場合。
| |
ArgumentError — テクスチャが大きすぎます:size パラメーターが 1024 よりも大きい場合。
| |
Error — テクスチャの作成に失敗しました:レンダリングコンテキストによる CubeTexture オブジェクトの作成ができなかった(にもかかわらず、理由に関する情報がない)場合。
| |
ArgumentError — 無効なストリーミングレベル:Invalid streaming level が log2(size) 以上の場合。
|
関連する API エレメント
createIndexBuffer | () | メソッド |
public function createIndexBuffer(numIndices:int, bufferUsage:String = "staticDraw"):IndexBuffer3D| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
IndexBuffer3D オブジェクトを作成します。
IndexBuffer3D オブジェクトを使用して、レンダリングコンテキストに一連の三角形のインデックスをアップロードし、レンダリング時にそのインデックスを参照します。インデックスバッファーの各インデックスは、頂点バッファーにある該当する頂点を参照します。一連の 3 つのインデックスで 1 つの三角形を定義します。IndexBuffer3D オブジェクトを drawTriangles() メソッドに渡し、インデックスバッファーで定義されている 1 つ以上の三角形をレンダリングします。
IndexBuffer3D クラスのコンストラクターで IndexBuffer3D オブジェクトを作成できないので、代わりにこのメソッドを使用します。IndexBuffer3D オブジェクトを作成したら、IndexBuffer3D の uploadFromVector() または uploadFromByteArray() メソッドを使用してインデックスをアップロードします。
パラメーター
numIndices:int — バッファーに保存する頂点の数。
| |
bufferUsage:String (default = "staticDraw") — 想定されるバッファー使用量。Context3DBufferUsage で定義された定数のうちの 1 つを使用します。正しく設定すると、ハードウェアドライバーは適切に最適化できます。このパラメーターは、Flash 12/AIR 4 以降でのみ使用できます。
|
IndexBuffer3D |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くのインデックスバッファーが作成されたか、インデックスバッファーに割り当てられたメモリの容量を超過した場合。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
| |
ArgumentError — バッファーが大きすぎます:numIndices が 0xf0000 以上の場合。
|
関連する API エレメント
createProgram | () | メソッド |
public function createProgram():Program3D| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
Program3D オブジェクトを作成します。
Program3D オブジェクトを使用して、レンダリングコンテキストにシェーダープログラムをアップロードし、レンダリング時にアップロードしたプログラムを参照します。Program3D オブジェクトは、頂点プログラムとフラグメントプログラム(ピクセルプログラムとも呼ばれます)の 2 つのプログラムを保存します。これらのプログラムは、バイナリのシェーダーアセンブリ言語で記述されます。
Program3D コンストラクターで Program3D オブジェクトを作成できないので、代わりにこのメソッドを使用します。Program3D オブジェクトを作成したら、Program3D の upload() メソッドを使用してプログラムをアップロードします。
Program3D |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — プログラム数が 4096 を超える場合、またはメモリの合計サイズが 16 MB を超える場合(dispose を使用して Program3D のリソースを解放します)。
|
関連する API エレメント
例 ( この例の使用方法 )
renderContext オブジェクトは Context3D クラスのインスタンスです。この例のプログラムは、Adobe Graphics Assembly Language(AGAL)で記述されています。
//A simple vertex program in AGAL
const VERTEX_SHADER:String =
"m44 op, va0, vc0 \n" +
"mov v0, va1";
//A simple fragment (or pixel) program in AGAL
const FRAGMENT_SHADER:String = "mov oc, v0";
var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
var programPair:Program3D;
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
createRectangleTexture | () | メソッド |
public function createRectangleTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean):flash.display3D.textures:RectangleTexture| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11.8, AIR 3.8 |
Rectangle Texture オブジェクトを作成します。
RectangleTexture オブジェクトを使用して、レンダリングコンテキストにテクスチャのビットマップをアップロードし、レンダリング時にテクスチャを参照します。
RectangleTexture コンストラクターで RectangleTexture オブジェクトを作成できないので、代わりにこのメソッドを使用します。RectangleTexture オブジェクトを作成したら、Texture の uploadFromBitmapData() または uploadFromByteArray() メソッドを使用して、テクスチャのビットマップをアップロードします。
32 bit 整数のテクスチャは、Flash の BitmapData の形式に適合させるために、パックされた BGRA 形式で保存されることに注意してください。浮動小数点テクスチャには、従来の RGBA 形式が使用されます。
Rectangle Texture は、幅と高さが 2 の累乗になる必要がなく、通常の 2D テクスチャとは異なります。また、ミップマップも含まれません。テクスチャへのレンダリングを行う場合に最も有効です。Rectangle Texture をミップマップフィルターまたは繰り返しの折り返しを使用するサンプラーで使用すると、drawTriangles の呼び出しは失敗します。Rectangle Texture ではストリーミングも使用できません。Rectangle Texture でサポートされるテクスチャ形式は、BGRA、BGR_PACKED、BGRA_PACKED のみです。Rectangle Texture では圧縮されたテクスチャ形式はサポートされません。
パラメーター
width:int — テクスチャの幅(テクセル単位)。
| |
height:int — テクスチャの高さ(テクセル単位)。
| |
format:String — Context3DTextureFormat の列挙リスト(テクセル形式)。
| |
optimizeForRenderToTexture:Boolean — テクスチャをレンダリングのターゲットとして使用する可能性がある場合は、true に設定します。
|
flash.display3D.textures:RectangleTexture |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの Texture オブジェクトが作成されたか、テクスチャに割り当てられたメモリの容量を超過した場合。
| |
ArgumentError — テクスチャのサイズがゼロです:width または height パラメーターのいずれかがゼロまたはそれ以下の場合。
| |
ArgumentError — テクスチャが大きすぎます:width および height パラメーターのいずれかが 2048 よりも大きい場合。
| |
Error — テクスチャの作成に失敗しました:レンダリングコンテキストによる Texture オブジェクトの作成ができなかった(にもかかわらず、理由に関する情報がない)場合。
| |
Error — ベースラインプロファイル以上が必要です:矩形テクスチャがベースラインの制限プロファイルで作成される場合。
|
関連する API エレメント
createTexture | () | メソッド |
public function createTexture(width:int, height:int, format:String, optimizeForRenderToTexture:Boolean, streamingLevels:int = 0):flash.display3D.textures:Texture| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
Texture オブジェクトを作成します。
Texture オブジェクトを使用して、レンダリングコンテキストにテクスチャのビットマップをアップロードし、レンダリング時にテクスチャを参照します。
Texture コンストラクターで Texture オブジェクトを作成できないので、代わりにこのメソッドを使用します。Texture オブジェクトを作成したら、Texture の uploadFromBitmapData()、uploadFromByteArray() または uploadCompressedTextureFromByteArray() メソッドを使用して、テクスチャのビットマップをアップロードします。
32 bit 整数のテクスチャは、Flash の BitmapData の形式に適合させるために、パックされた BGRA 形式で保存されることに注意してください。浮動小数点テクスチャには、従来の RGBA 形式が使用されます。
パラメーター
width:int — テクスチャの幅(テクセル単位)。
| |
height:int — テクスチャの高さ(テクセル単位)。
| |
format:String — Context3DTextureFormat の列挙リスト(テクセル形式)。
テクスチャの圧縮では、テクスチャのイメージを圧縮形式で GPU に直接保存することにより、GPU のメモリとメモリ帯域幅の消費を抑えることができます。通常、圧縮テクスチャはオフラインで圧縮され、Texture.uploadCompressedTextureFromByteArray メソッドを使用して圧縮形式で GPU にアップロードされます。デスクトッププラットフォーム上の Flash Player 11.4 および AIR 3.4 では、ランタイムのテクスチャ圧縮がサポートされています。この機能は、ベクターアートから動的テクスチャをレンダリングするなどの場合に便利です。ただし、この機能は現在モバイルプラットフォームでは使用できず、ArgumentError(テクスチャ形式が一致しません)がスローされます。ランタイムのテクスチャ圧縮を使用するには、以下の手順を実行します。1. Context3D.createTexture() メソッドを呼び出してテクスチャオブジェクトを作成し、format パラメーターとして flash.display3D.Context3DTextureFormat.COMPRESSED または flash.display3D.Context3DTextureFormat.COMPRESSED_ALPHA のどちらかを渡します。2. createTexture() によって返された flash.display3D.textures.Texture インスタンスを使用して、flash.display3D.textures.Texture.uploadFromBitmapData() または flash.display3D.textures.Texture.uploadFromByteArray() のどちらかを呼び出し、テクスチャのアップロードと圧縮を一度に行います。 | |
optimizeForRenderToTexture:Boolean — テクスチャをレンダリングのターゲットとして使用する可能性がある場合は、true に設定します。
| |
streamingLevels:int (default = 0) — 画像をレンダリングする前にロードする必要のある MIP マップレベル。テクスチャストリーミングを使用すると、最も小さいミップレベルからロードして表示し、テクスチャのロード時に高品質の画像をプログレッシブに表示することができます。高画質の画像がロードされる間、エンドユーザーは低画質の画像を表示できます。
デフォルトの streamingLevels は 0 です。0 は、画像をレンダリングする前に MIP マップ内の最高画質の画像をロードする必要があることを表します。このパラメーターは Flash Player 11.3 および AIR 3.3 で追加されました。これらより前のバージョンの Flash Player および AIR の動作を維持するには、デフォルト値を使用してください。
注意:このプロパティを 0 より大きい値に設定すると、メモリ使用量とパフォーマンスに影響を及ぼすことがあります。 |
flash.display3D.textures:Texture |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの Texture オブジェクトが作成されたか、テクスチャに割り当てられたメモリの容量を超過した場合。
| |
ArgumentError — 深度テクスチャはまだ実装されていません:深度テクスチャを作成しようとした場合。
| |
ArgumentError — テクスチャのサイズがゼロです:width または height パラメーターのいずれかがゼロまたはそれ以下の場合。
| |
ArgumentError — テクスチャのサイズが 2 の累乗ではありません:width および height パラメーターのいずれも 2 の累乗ではない場合。
| |
ArgumentError — テクスチャが大きすぎます:ベースラインおよびベースラインの制限プロファイルの width または height パラメーターが 2048 よりも大きい場合、あるいは拡張された上記のプロファイルベースラインの width または height パラメーターが 4096 よりも大きい場合。
| |
Error — テクスチャの作成に失敗しました:レンダリングコンテキストによる Texture オブジェクトの作成ができなかった(にもかかわらず、理由に関する情報がない)場合。
| |
ArgumentError — 無効なストリーミングレベル:streamingLevels が log2(min(width,height)) 以上の場合。
|
関連する API エレメント
createVertexBuffer | () | メソッド |
public function createVertexBuffer(numVertices:int, data32PerVertex:int, bufferUsage:String = "staticDraw"):VertexBuffer3D| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
VertexBuffer3D オブジェクトを作成します。
VertexBuffer3D オブジェクトを使用して、レンダリングコンテキストに一連の頂点データをアップロードします。頂点バッファーには、シーンのジオメトリに各ポイントをレンダリングする必要があるデータが含まれています。通常、各頂点に関連付けられているデータ属性には、位置、カラー、テクスチャ座標があり、頂点シェーダープログラムへの入力となります。setVertexBufferAt() メソッドを使用して、頂点プログラムの入力の 1 つに該当するデータ値を特定します。各頂点に対し、最大 64 個の 32 bit 値を指定できます
VertexBuffer3D コンストラクターで VertexBuffer3D オブジェクトを作成できないので、代わりにこのメソッドを使用します。VertexBuffer3D オブジェクトを作成したら、VertexBuffer3D の uploadFromVector() または uploadFromByteArray() メソッドを使用して頂点データをアップロードします。
パラメーター
numVertices:int — バッファーに保存する頂点の数。1 つのバッファーに保存できる頂点の最大数は 65535 です。
| |
data32PerVertex:int — 各頂点に関連付けられている 32 bit(4 バイト)データ値の数。各頂点の 32 bit データエレメントの最大数は 64(256 バイト)です。頂点シェーダープログラムからアクセスできる attribute レジスタの数は、どのような場合でも 8 個のみです。頂点バッファー内の属性を選択するには、SetVertextBufferAt() を使用します。
| |
bufferUsage:String (default = "staticDraw") — 想定されるバッファー使用量。Context3DBufferUsage で定義された定数のうちの 1 つを使用します。正しく設定すると、ハードウェアドライバーは適切に最適化できます。このパラメーターは、Flash 12/AIR 4 以降でのみ使用できます。
|
VertexBuffer3D |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの頂点バッファーが作成されたか、頂点バッファーに割り当てられたメモリの容量を超過した場合。
| |
ArgumentError — バッファーが大きすぎます:numVertices が 0x10000 を超えているか、data32PerVertex が 64 を超えている場合。
| |
ArgumentError — バッファーのサイズがゼロです:numVertices が 0 または data32PerVertex が 0 の場合。
| |
ArgumentError — バッファーの作成に失敗しました:レンダリングコンテキストによる VertexBuffer3D オブジェクトの作成ができなかった(にもかかわらず、理由に関する詳細情報がない)場合。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
|
関連する API エレメント
例 ( この例の使用方法 )
setVertexBufferAt() メソッドを呼び出して、最初の 3 組のデータポイントが va0 で 3 つの浮動小数点値として頂点プログラムに渡されること、および 2 つ目の 3 組のデータポイントが va1 として渡されることを指定します。頂点プログラムでは、この方法で最大 8 つの入力(頂点属性レジスタとも呼ばれます)を定義できます。
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b format
0, 0, 0, 1, 1, 1,
-1, 1, 0, 0, 0,.5,
1, 1, 0, 0, 0, 1,
1,-1, 0, .5, 0, 0,
-1,-1, 0, 1, 0, 0
]
);
var vertexes:VertexBuffer3D = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //Defines shader input va0 as the position data
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //Defines shader input va1 as the color data
createVertexBufferForInstances | () | メソッド |
public function createVertexBufferForInstances(numVertices:int, data32PerVertex:int, instancesPerElement:int, bufferUsage:String = "staticDraw"):VertexBuffer3D| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | AIR 20.0 |
インスタンスデータの VertexBuffer3D オブジェクトを作成します。
VertexBuffer3D オブジェクトを使用して、レンダリングコンテキストに一連のインスタンスデータをアップロードします。頂点バッファーには、シーンのジオメトリに各インスタンスをレンダリングする必要があるデータが含まれています。インスタンスデータを含む頂点バッファーは、インスタンスのすべての頂点に共通する属性を提供し、頂点シェーダープログラムの入力として機能します。setVertexBufferAt() メソッドを使用して、頂点プログラムの入力の 1 つに該当するデータ値を特定します。頂点バッファーの各エレメントに対し、最大 64 個の 32 bit 値を指定できます
VertexBuffer3D コンストラクターで VertexBuffer3D オブジェクトを作成できないので、代わりにこのメソッドを使用します。VertexBuffer3D オブジェクトを作成したら、VertexBuffer3D の uploadFromVector() または uploadFromByteArray() メソッドを使用して頂点データをアップロードします。
パラメーター
numVertices:int — バッファーに保存するエレメントの数。1 つのバッファーに保存できるエレメントの最大数は 65535 です。
| |
data32PerVertex:int — 各エレメントに関連付けられている 32 bit(4 バイト)データ値の数。各頂点の 32 bit データエレメントの最大数は 64(256 バイト)です。
| |
instancesPerElement:int — 頂点バッファーの 1 つのエレメントを使用するインスタンスの数。
| |
bufferUsage:String (default = "staticDraw") — 想定されるバッファー使用量。Context3DBufferUsage で定義された定数のうちの 1 つを使用します。正しく設定すると、ハードウェアドライバーは適切に最適化できます。このパラメーターは、Flash 12/AIR 4 以降でのみ使用できます。
|
VertexBuffer3D |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの頂点バッファーが作成されたか、頂点バッファーに割り当てられたメモリの容量を超過した場合。
| |
ArgumentError — バッファーが大きすぎます:numVertices が 0x10000 を超えているか、data32PerVertex が 64 を超えている場合。
| |
ArgumentError — バッファーのサイズがゼロです:numVertices が 0 または data32PerVertex が 0 の場合。
| |
ArgumentError — バッファーの作成に失敗しました:レンダリングコンテキストによる VertexBuffer3D オブジェクトの作成ができなかった(にもかかわらず、理由に関する詳細情報がない)場合。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
| |
Error — 標準の拡張プロファイル以上が必要です:要求されたプロファイルが標準の拡張プロファイル未満のときにこのメソッドが呼び出された場合。
| |
Error — エレメントあたりのインスタンス数が無効です:instancesPerElement が 0 以下の場合。
|
関連する API エレメント
createVideoTexture | () | メソッド |
public function createVideoTexture():flash.display3D.textures:VideoTexture| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | AIR 17.0, Flash Player 18.0 |
VideoTexture オブジェクトを作成します。
VideoTexture オブジェクトを使用して、NetStream オブジェクトまたは Camera オブジェクトからビデオフレームをテクスチャとして取得したり、ビデオフレームをレンダリングコンテキストにアップロードします。
VideoTexture オブジェクトは、VideoTexture コンストラクターで作成できません。代わりにこのメソッドを使用してください。VideoTexture オブジェクトを作成したら、NetStream オブジェクトまたは Camera オブジェクトを添付し、VideoTexture attachNetStream() または attachCamera() メソッドを使用してビデオフレームを取得します。
システムがこの機能をサポートしていない場合、このメソッドは null を返します。
VideoTexture はミップマップを含みません。VideoTexture をミップマップフィルターまたは繰り返しの折り返しを使用するサンプラーで使用すると、drawTriangles の呼び出しは失敗します。VideoTexture は、シェーダーで BGRA テクスチャとして扱うことができます。Context3D がソフトウェアレンダリングモードでリクエストされた場合、VideoTexture オブジェクトをインスタンス化しようとすると失敗します。
1 つの Context3D インスタンスあたり、最大で 4 つの VideoTexture オブジェクトを利用できます。モバイルの場合は、プラットフォームの制限により、実際にサポートされる VideoTexture オブジェクトの数は 4 つ未満となる場合があります。
戻り値flash.display3D.textures:VideoTexture |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — リソースの制限を超えました:あまりに多くの Texture オブジェクトが作成されたか、テクスチャに割り当てられたメモリの容量を超過した場合。
| |
Error — テクスチャの作成に失敗しました:レンダリングコンテキストによる Texture オブジェクトの作成ができなかった(にもかかわらず、理由に関する情報がない)場合。
|
dispose | () | メソッド |
public function dispose(recreate:Boolean = true):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
この Context3D に関連付けられているすべてのリソースおよび内部記憶領域を開放します。
この Context3D で作成したインデックスバッファー、頂点バッファー、テクスチャおよびプログラムがすべて、個別に dispose() を呼び出したときと同様に破棄されます。また Context3D 自体も破棄され、すべての一時バッファーおよびバックバッファーが解放されます。dispose() を呼び出した後で、configureBackBuffer()、clear()、drawTriangles()、createCubeTexture()、createTexture()、createProgram()、createIndexBuffer()、createVertexBuffer()、drawToBitmapData() のいずれかを呼び出すと、ランタイムによって例外がスローされます。
警告:関連する Stage3D オブジェクトで Events.CONTEXT3D_CREATE 用のイベントリスナーがまだ設定されているうちに、Context3D で dispose() を呼び出すと、デバイス損失がシミュレートされます。Stage3D で新しい Context3D が作成され、Events.CONTEXT3D_CREATE イベントが再度発行されます。この状況を回避したい場合は、dispose() を呼び出す前に Stage3D オブジェクトからこのイベントリスナーを削除するか、recreate パラメーターを false に設定してください。
パラメーター
recreate:Boolean (default = true) |
関連する API エレメント
flash.display.Stage3D
drawToBitmapData | () | メソッド |
public function drawToBitmapData(destination:BitmapData, srcRect:Rectangle = null, destPoint:Point = null):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | AIR 3 |
ビットマップに現在のレンダリングバッファーを描画します。
バックレンダリングバッファーの現在のコンテンツが BitmapData オブジェクトにコピーされます。場合によっては、これは非常に低速な操作となり、最大 1 秒かかります。使用の際は注意が必要です。この関数はフロントレンダリングバッファー(ステージに表示されているバッファー)をコピーするのではなく、描画先のバッファーをコピーします。ステージ上の表示どおりにレンダリングされたイメージをキャプチャするには、drawToBitmapData() を呼び出してから、present() を呼び出します。
AIR 25 から、API drawToBitmapData() に 2 つの新しいパラメーターが導入されました。この API は、3 つのパラメーターを取るようになりました。1 つ目のパラメーターは、既存のパラメーター destination:BitmapData です。2 つ目のパラメーター srcRect:Rectangle は、stage3D 上のターゲット矩形です。3 つ目のパラメーター destPoint:Point は、コピー先のビットマップ上の座標です。パラメーター srcRect と destPoint はオプションで、デフォルト値はそれぞれ (0,0,bitmapWidth,bitmapHeight) と (0,0) です。
イメージが描画されると、ビットマップに適合するように拡大/縮小されずに、コンテンツは、コピー先のビットマップのサイズにクリッピングされます。
Flash の BitmapData オブジェクトは、アルファ成分で乗算済みのカラーを保存します。例えば、ピクセルの「純粋な」RGB カラー成分が (0x0A, 0x12, 0xBB) で、アルファ成分が 0x7F (.5) の場合、そのピクセルは、rgba 値:(0x05, 0x09, 0x5D, 0x7F) で BitmapData オブジェクトに保存されます。ブレンド係数を設定して、バッファーにレンダリングされたカラーにアルファを乗算したり、フラグメントシェーダーで操作を実行することができます。レンダリングコンテキストでは、カラーが事前に乗算された形式で保存されているかどうかは検証されません。
パラメーター
destination:BitmapData | |
srcRect:Rectangle (default = null) | |
destPoint:Point (default = null) |
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
| |
Error — 3802:パラメーター destPoint:Point または srcRect:Rectangle のどちらかがビットマップ/stage3D の座標境界外の場合、または非数(NaN)の値が入力として渡された場合。
|
例 ( この例の使用方法 )
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.filters.DropShadowFilter;
public class Context3D_drawToBitmapData extends Sprite
{
public const viewWidth:Number = 320;
public const viewHeight:Number = 200;
private var bitmap:Bitmap;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
public function Context3D_drawToBitmapData()
{
stage3D = this.stage.stage3Ds[0];
stage3D.x = 0;
stage3D.y = 0;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b format
0, 0, 0, 1, 1, 1,
-1, 1, 0, 0, 0,.5,
1, 1, 0, 0, 0, 1,
1,-1, 0, .5, 0, 0,
-1,-1, 0, 1, 0, 0
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
//Clear required before first drawTriangles() call
renderContext.clear( .3,.3,.3 );
//Draw the 2 triangles
renderContext.drawTriangles( indexList, 0, 2 );
var renderedBitmapData:BitmapData = new BitmapData( viewWidth, viewHeight, true );
renderContext.drawToBitmapData( renderedBitmapData );
renderContext.present();
//Add to stage
bitmap = new Bitmap( renderedBitmapData );
this.addChild( bitmap );
bitmap.x = 55;
bitmap.y = 25;
bitmap.filters = [new DropShadowFilter( 8, 235, .4 )];
}
}
}
drawTriangles | () | メソッド |
public function drawTriangles(indexBuffer:IndexBuffer3D, firstIndex:int = 0, numTriangles:int = -1):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
現在のバッファーと、この Context3D オブジェクトの状態を使用して、指定した三角形をレンダリングします。
三角形ごとに、三角形の頂点は頂点シェーダープログラムで処理され、三角形の面はピクセルシェーダープログラムで処理されます。各ピクセルに関してピクセルプログラムから出力される色は、ステンシルの操作、深度テスト、レンダリング元とレンダリング先のアルファ、現在のブレンドモードに従って、レンダリングターゲットに描画されます。レンダリング先の対象は、主要なレンダリングバッファーまたはテクスチャです。
カリングが有効な場合(setCulling() メソッドを使用)は、ピクセルプログラムを実行する前にシーンから三角形を破棄できます。ステンシルおよび深度のテストが有効な場合は、レンダリング先を更新せずに、ピクセルプログラムからの出力ピクセルを破棄できます。また、ピクセルの色を出力しないことをピクセルプログラムで決定することもできます。
レンダリングされた三角形は、present() メメソッドを呼び出すまでビューポイントに表示されません。毎回 present() を呼び出した後に、clear() メソッドを呼び出してから、drawTriangles() を呼び出さないと、レンダリングが失敗します。
enableErrorChecking が false の場合、この関数は直ちに返され、結果を待たず、この Context3D インスタンスが破棄された場合や描画呼び出しが多すぎる場合にのみ例外がスローされます。レンダリングコンテキストの状態が無効な場合、レンダリングは通知なしで失敗します。enableErrorChecking プロパティが true の場合、この関数は三角形を描画した後で返され、描画エラーや無効なコンテキスト状態がある場合は例外がスローされます。
パラメーター
indexBuffer:IndexBuffer3D — レンダリングする頂点を参照する一連の頂点インデックス。
| |
firstIndex:int (default = 0) — レンダリング時に最初の頂点インデックスとして選択するインデックス。デフォルト値は 0 です。
| |
numTriangles:int (default = -1) — レンダリングする三角形の数。各三角形は 3 つのインデックスを使用します。インデックスバッファーですべての三角形を描画するには、-1 を渡します。デフォルト値は -1 です。
|
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — present() に対する呼び出しの合間に、このメソッドを呼び出す回数が多すぎた場合。呼び出し回数の上限は 32,768 回です。
次のエラーは、 | |
Error — 描画の前にクリアする必要があります:前回 present() を呼び出してから、バッファーがクリアされていない場合。
| |
Error — 有効な Program3D オブジェクトが設定されていない場合。
| |
Error — 有効なインデックスバッファーセットがありません:IndexBuffer3D オブジェクトが設定されていない場合。
| |
Error — パラメーターの健全性チェックに失敗しました:描画する三角形の数または firstIndex の数が許容値を超えている場合。
| |
RangeError — バッファーに十分なインデックスがありません:描画する三角形の数を定義するバッファーに十分なインデックスがない場合。
| |
Error — サンプラーはレンダリング用にもバインドされているテクスチャをバインドします:レンダリングターゲットがテクスチャで、そのテクスチャが現在のフラグメントプログラムのテクスチャ入力に割り当てられている場合。
| |
Error — サンプラーは無効なテクスチャをバインドします:現在のフラグメントプログラムへの入力として、無効なテクスチャが指定されている場合。
| |
Error — サンプラーの形式がテクスチャの形式と一致しません:現在のフラグメントプログラムへの入力として割り当てられているテクスチャの形式が、sampler レジスタに指定されている形式と異なる場合。2D テクスチャが立方体テクスチャのサンプラーに割り当てられている場合など。
| |
Error — サンプラーは未定義のテクスチャをバインドします:現在のフラグメントプログラムが、(setTextureAt() を使用して)設定されていないテクスチャレジスタにアクセスした場合。
| |
Error — 同一テクスチャには同一サンプラーパラメーターが必要です:テクスチャを複数の sampler レジスタで使用するときに、すべてのサンプラーに同じ設定を行う必要がある場合。例えば、1 つのサンプラーをクランプに設定し、もう 1 つをラップに設定することはできません。
| |
Error — テクスチャはバインドされますが、使用されません:テクスチャがシェーダー入力として設定されているが、使用されない場合。
| |
Error — ストリームは使用されません:頂点バッファーが頂点属性入力に割り当てられているが、頂点プログラムは対応するレジスタを参照しない場合。
| |
Error — ストリームは無効です:頂点プログラムの入力に割り当てられている VertexBuffer3D オブジェクトが有効なオブジェクトでない場合。
| |
RangeError — ストリームには十分な頂点がありません:指定の三角形の描画用データを提供する頂点バッファーに十分なデータがない場合。
| |
RangeError — ストリームの頂点オフセットが境界外です:setVertexBufferAt() の呼び出しに指定されているオフセットが負の値か、バッファーの境界を越えている場合。
| |
Error — ストリームは読み取られますが、設定されません:現在の頂点プログラムに使用されている頂点属性が、(setVertexBufferAt() を使用して)設定されていない場合。
|
関連する API エレメント
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
例 ( この例の使用方法 )
三角形は、頂点バッファーとインデックスバッファーを使用して定義されます。頂点バッファーには、三角形の各頂点の位置と色の情報が含まれます。インデックスバッファーには、頂点バッファーへのインデックスが含まれます。3 つのインデックスによって 1 つの三角形が定義されます。例えば、頂点バッファーの最初の 3 つの点で構成される三角形は、インデックスバッファーに 0,1,2 として表示されます。
この簡単な例では、3D 変形は行われません。標準的な表示領域内のオブジェクト(2x2x1 の単位ボリューム)のみが表示可能であり、三角形の座標はこの領域内に定義されます。ただし、典型的な 3D シーンをレンダリングするときは、遠近投影法または正投影法を使用して、レンダリングするオブジェクトを「ワールド」座標系からこの表示領域に投影します。
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
public class Context3D_drawTriangles extends Sprite
{
public const viewWidth:Number = 320;
public const viewHeight:Number = 200;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
public function Context3D_drawTriangles()
{
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b format
0, 0, 0, 1, 1, 1,
-1, 1, 0, 0, 0,.5,
1, 1, 0, 0, 0, 1,
1,-1, 0, .5, 0, 0,
-1,-1, 0, 1, 0, 0
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
//Clear required before first drawTriangles() call
renderContext.clear( .3,.3,.3 );
//Draw the 2 triangles
renderContext.drawTriangles( indexList, 0, 2 );
//Show the frame
renderContext.present();
}
}
}
drawTrianglesInstanced | () | メソッド |
public function drawTrianglesInstanced(indexBuffer:IndexBuffer3D, numInstances:int, firstIndex:int = 0, numTriangles:int = -1):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | AIR 20.0 |
現在のバッファーと、この Context3D オブジェクトの状態を使用して、指定したインスタンス化済みの三角形をレンダリングします。
各インスタンスの三角形ごとに、三角形の頂点は頂点シェーダープログラムで処理され、三角形の面はピクセルシェーダープログラムで処理されます。各ピクセルに関してピクセルプログラムから出力される色は、ステンシルの操作、深度テスト、レンダリング元とレンダリング先のアルファ、現在のブレンドモードに従って、レンダリングターゲットに描画されます。レンダリング先の対象は、主要なレンダリングバッファーまたはテクスチャです。
カリングが有効な場合(setCulling() メソッドを使用)は、ピクセルプログラムを実行する前にシーンから三角形を破棄できます。ステンシルおよび深度のテストが有効な場合は、レンダリング先を更新せずに、ピクセルプログラムからの出力ピクセルを破棄できます。また、ピクセルの色を出力しないことをピクセルプログラムで決定することもできます。
レンダリングされたインスタンス化済みの三角形は、present() メソッドを呼び出すまでビューポイントに表示されません。毎回 present() を呼び出した後に、clear() メソッドを呼び出してから、drawTrianglesInstanced() を呼び出さないと、レンダリングが失敗します。
enableErrorChecking が false の場合、この関数は直ちに返され、結果を待たず、この Context3D インスタンスが破棄された場合や描画呼び出しが多すぎる場合にのみ例外がスローされます。レンダリングコンテキストの状態が無効な場合、レンダリングは通知なしで失敗します。enableErrorChecking プロパティが true の場合、この関数は三角形を描画した後で返され、描画エラーや無効なコンテキスト状態がある場合は例外がスローされます。
インスタンス化されたバッファーが SetVertexAt() を使用して適切に順序付けられていない場合、例外がスローされることがあります。例えば、Direct 3D 9 では、SetStreamSourceFreq() API を使用して、インデックス付きのジオメトリデータと描画するインスタンス数を常にストリーム 0 に設定する必要があります。
つまり、SetVertexBufferAt() を頂点シェーダープログラムへの入力として使用して配置する場合、CreateVertexBufferForInstance() を使用して作成された頂点バッファーを最小インデックス番号で配置してはいけません。CreateVertexBuffer() を使用して生成された頂点バッファーは、CreateVertexBufferForInstance() のインデックス番号より小さいインデックス番号で配置する必要があります。一般的に、SetVertexBufferAt() を使用してジオメトリデータを配置してから、インスタンスごとのデータを配置する必要があります。
パラメーター
indexBuffer:IndexBuffer3D — レンダリングする頂点を参照する一連の頂点インデックス。
| |
numInstances:int — レンダリングするインスタンスの数。
| |
firstIndex:int (default = 0) — レンダリング時に最初の頂点インデックスとして選択するインデックス。デフォルト値は 0 です。
| |
numTriangles:int (default = -1) — レンダリングする三角形の数。各三角形は 3 つのインデックスを使用します。インデックスバッファーですべての三角形を描画するには、-1 を渡します。デフォルト値は -1 です。
|
例外
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
| |
Error — present() に対する呼び出しの合間に、このメソッドを呼び出す回数が多すぎた場合。呼び出し回数の上限は 32,768 回です。
| |
Error — 標準の拡張プロファイル以上が必要です:要求されたプロファイルが標準の拡張プロファイル未満のときにこのメソッドが呼び出された場合。
| |
Error — 負の numInstances を指定してこのメソッドが呼び出された場合。
次のエラーは、 | |
Error — 描画の前にクリアする必要があります:前回 present() を呼び出してから、バッファーがクリアされていない場合。
| |
Error — 有効な Program3D オブジェクトが設定されていない場合。
| |
Error — 有効なインデックスバッファーセットがありません:IndexBuffer3D オブジェクトが設定されていない場合。
| |
Error — パラメーターの健全性チェックに失敗しました:描画する三角形の数または firstIndex の数が許容値を超えている場合。
| |
RangeError — バッファーに十分なインデックスがありません:描画する三角形の数を定義するバッファーに十分なインデックスがない場合。
| |
Error — サンプラーはレンダリング用にもバインドされているテクスチャをバインドします:レンダリングターゲットがテクスチャで、そのテクスチャが現在のフラグメントプログラムのテクスチャ入力に割り当てられている場合。
| |
Error — サンプラーは無効なテクスチャをバインドします:現在のフラグメントプログラムへの入力として、無効なテクスチャが指定されている場合。
| |
Error — サンプラーの形式がテクスチャの形式と一致しません:現在のフラグメントプログラムへの入力として割り当てられているテクスチャの形式が、sampler レジスタに指定されている形式と異なる場合。2D テクスチャが立方体テクスチャのサンプラーに割り当てられている場合など。
| |
Error — サンプラーは未定義のテクスチャをバインドします:現在のフラグメントプログラムが、(setTextureAt() を使用して)設定されていないテクスチャレジスタにアクセスした場合。
| |
Error — 同一テクスチャには同一サンプラーパラメーターが必要です:テクスチャを複数の sampler レジスタで使用するときに、すべてのサンプラーに同じ設定を行う必要がある場合。例えば、1 つのサンプラーをクランプに設定し、もう 1 つをラップに設定することはできません。
| |
Error — テクスチャはバインドされますが、使用されません:テクスチャがシェーダー入力として設定されているが、使用されない場合。
| |
Error — ストリームは使用されません:頂点バッファーが頂点属性入力に割り当てられているが、頂点プログラムは対応するレジスタを参照しない場合。
| |
Error — ストリームは無効です:頂点プログラムの入力に割り当てられている VertexBuffer3D オブジェクトが有効なオブジェクトでない場合。
| |
RangeError — ストリームには十分な頂点がありません:指定の三角形の描画用データを提供する頂点バッファーに十分なデータがない場合。
| |
RangeError — ストリームの頂点オフセットが境界外です:setVertexBufferAt() の呼び出しに指定されているオフセットが負の値か、バッファーの境界を越えている場合。
| |
Error — ストリームは読み取られますが、設定されません:現在の頂点プログラムに使用されている頂点属性が、(setVertexBufferAt() を使用して)設定されていない場合。
| |
Error — 頂点バッファーストリームに含まれているエレメントの数が、インスタンスに対して足りません:頂点バッファーストリームに含まれているエレメントの数が、インスタンスの数に対して足りません。
| |
Error — インスタンスに対する頂点バッファーストリームが、最小インデックス属性レジスタに適切に設定されていません:CreateVertexBuffer() を使用して生成された頂点バッファーのインデックス番号が、CreateVertexBufferForInstance() を使用して生成された頂点バッファーのインデックス番号より大きい場合。
|
関連する API エレメント
VertexBuffer3D.upload()
IndexBuffer3D.upload()
flash.display3D.textures.Texture
Program3D
例 ( この例の使用方法 )
package
{
import com.adobe.utils.v3.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTriangleFace;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.utils.ByteArray;
public class Context3D_HelloInstancedDrawing extends Sprite
{
private var W:int;
private var H:int;
private var renderContext:Context3D;
private var program:Program3D;
private var vertexBuffer:VertexBuffer3D;
private var instanceBufferColor:VertexBuffer3D;
private var instanceBufferTranslation:VertexBuffer3D;
private var indexBuffer:IndexBuffer3D;
private var m:Matrix3D;
private var vertexShader:ByteArray;
private var fragmentShader:ByteArray;
public function Context3D_HelloInstancedDrawing()
{
if (hasEventListener(Event.ADDED_TO_STAGE))
removeEventListener(Event.ADDED_TO_STAGE, init);
W = stage.stageWidth;
H = stage.stageHeight;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, contextCreated);
//We need to request context3D in standard extended profile as instanced drawing requires standard extended profile.
stage.stage3Ds[0].requestContext3D("auto","standardExtended");
}
//Note: <code>context3DCreate</code> event can happen at any time. For example, when the hardware resources are taken up by another process.
private function contextCreated( event:Event ):void
{
var t:Stage3D = event.target as Stage3D;
renderContext = t.context3D;
trace( "3D driver: " + renderContext.driverInfo );
setupScene();
}
private function setupScene():void
{
renderContext.enableErrorChecking = true;
renderContext.configureBackBuffer( W, H, 2, false );
renderContext.setCulling( Context3DTriangleFace.BACK );
//create vertex buffer for geometry information of the instances (same geometry of the instances)
vertexBuffer = renderContext.createVertexBuffer(3, 3);
//The color and translation information varies across the instances. Use <code>createVertexBufferForInstances</code> for color and translation information.
//the intancesPerElement parameter used is 1 which means that each instance will use unique element of the instances buffer
//if the intancesPerElement is 3 then sets of 3 instances will use the same element of the instances buffer
instanceBufferColor = renderContext.createVertexBufferForInstances(4,3,1);
instanceBufferTranslation = renderContext.createVertexBufferForInstances(4,3,1);
//create index buffer for the triangle
indexBuffer = renderContext.createIndexBuffer(3);
//create and compile program
program = renderContext.createProgram();
var assembler:AGALMiniAssembler = new AGALMiniAssembler();
// VERTEX SHADER
var code:String = "";
//The vertex shader code runs for every vertex of each instance.
//The vertex buffers uploaded for instance data (va1,va2) are used when the vertex shader for that particular instance is being executed.
code += "add vt0, va0, va2\n";
code += "mov op, vt0\n";
code += "mov v0, va1\n";
vertexShader = assembler.assemble(Context3DProgramType.VERTEX, code);
//FRAGMENT SHADER
code = "mov oc, v0\n";
// Compile the agal code into bytecode using agalminiassembler
fragmentShader = assembler.assemble(Context3DProgramType.FRAGMENT, code);
//upload program to gpu
program.upload(vertexShader, fragmentShader);
//geometry data for the instances
var vertexData:Vector.<Number>=Vector.<Number>([
-0.3, -0.3, 0, // - 1st vertex x,y,z
0, 0.3, 1, // - 2nd vertex x,y,z
0.3, -0.3, 0 // - 3rd vertex x,y,z
]);
//per instance color data
var instanceColorData:Vector.<Number>=Vector.<Number>([
1.0, 0.0, 0.0, // - 1st instance r,g,b
0.0, 1.0, 0.0, // - 2nd instance r,g,b
1.0, 1.0, 1.0, // - 3rd instance r,g,b
0.7, 0.0, 1.0 // - 4th instance r,g,b
]);
//per instance translation data
var instanceTranslationData:Vector.<Number>=Vector.<Number>([
-0.3, -0.3, 0.0, // - 1st instance x,y,z
0.3, 0.3, 0.0, // - 2nd instance x,y,z
-0.3, 0.3, 0.0, // - 3rd instance x,y,z
0.3, -0.3, 0.0 // - 4th instance x,y,z
]);
vertexBuffer.uploadFromVector(vertexData, 0, 3);
instanceBufferColor.uploadFromVector(instanceColorData, 0, 4);
indexBuffer.uploadFromVector(Vector.<uint>([0, 1, 2]), 0, 3);
instanceBufferTranslation.uploadFromVector(instanceTranslationData, 0, 4);
//pass data to program
renderContext.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
renderContext.setVertexBufferAt(1, instanceBufferColor, 0, Context3DVertexBufferFormat.FLOAT_3);
renderContext.setVertexBufferAt(2, instanceBufferTranslation, 0, Context3DVertexBufferFormat.FLOAT_3);
//set active program
renderContext.setProgram(program);
renderContext.enableErrorChecking = true;
addEventListener(Event.ENTER_FRAME, render);
}
private function render( event:Event ):void
{
renderContext.clear(0.3, 0.2, 1, 1); // Clear the backbuffer by filling it with the given color
//Draw three instances of the same geometry but with varying instance data specified using <code>vertexBufferForInstances</code>.
renderContext.drawTrianglesInstanced(indexBuffer,4);
renderContext.present(); // render the backbuffer on screen.
}
}
}
package
{
import com.adobe.utils.v3.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DTriangleFace;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.utils.ByteArray;
public class Context3D_HelloInstanceIdRegister extends Sprite
{
private var W:int;
private var H:int;
private var renderContext:Context3D;
private var program:Program3D;
private var vertexBuffer:VertexBuffer3D;
private var instanceBufferColor:VertexBuffer3D;
private var instanceBufferTranslation:VertexBuffer3D;
private var indexBuffer:IndexBuffer3D;
private var m:Matrix3D;
private var vertexShader:ByteArray;
private var fragmentShader:ByteArray;
public function Context3D_HelloInstanceIdRegister()
{
if (hasEventListener(Event.ADDED_TO_STAGE))
removeEventListener(Event.ADDED_TO_STAGE, init);
W = stage.stageWidth;
H = stage.stageHeight;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.stage3Ds[0].addEventListener(Event.CONTEXT3D_CREATE, contextCreated);
//We need to request context3D in standard extended profile as instanced drawing requires standard extended profile.
stage.stage3Ds[0].requestContext3D("auto","standardExtended");
}
//Note: <code>context3DCreate</code> event can happen at any time. For example, when the hardware resources are taken up by another process.
private function contextCreated( event:Event ):void
{
var t:Stage3D = event.target as Stage3D;
renderContext = t.context3D;
trace( "3D driver: " + renderContext.driverInfo );
setupScene();
}
private function setupScene():void
{
renderContext.enableErrorChecking = true;
renderContext.configureBackBuffer( W, H, 2, false );
renderContext.setCulling( Context3DTriangleFace.BACK );
//create vertex buffer for geometry information of the instances (same geometry of the instances)
vertexBuffer = renderContext.createVertexBuffer(3, 3);
//The color and translation information varies across the instances. Use <code>createVertexBufferForInstances</code> for color and translation information.
//the intancesPerElement parameter used is 1 which means that each instance will use unique element of the instances buffer
//if the intancesPerElement is 3 then sets of 3 instances will use the same element of the instances buffer
instanceBufferColor = renderContext.createVertexBufferForInstances(4,3,1);
instanceBufferTranslation = renderContext.createVertexBufferForInstances(4,3,1);
//create index buffer for the triangle
indexBuffer = renderContext.createIndexBuffer(3);
//create and compile program
program = renderContext.createProgram();
//Note : for instance id support , use the latest AgalMiniAssembler from github - https://github.com/adobe-flash/graphicscorelib/blob/master/src/com/adobe/utils/v3/AGALMiniAssembler.as
var assembler:AGALMiniAssembler = new AGALMiniAssembler();
// VERTEX SHADER
var code:String = "";
//the vertex shader code will run for every vertex of every instance ,
//the vertex buffers uploaded for instance data (va1,va2) will be used when vertex shader for that particular instance is being executed
//the vertex shader code below indexes the program constants matrix using iid.x. iid is a new register introduced in vertex shader for instanced drawing
//it is a read only register , iid.x gives the current instance id whose shader is being executed
code += "add vt0, va0, va2\n";
code += "mul vt1, vt0, vc[iid.x]\n"
code += "mov op, vt1\n";
code += "mov v0, va1\n";
vertexShader = assembler.assemble(Context3DProgramType.VERTEX, code, 3);
//FRAGMENT SHADER
code = "mov oc, v0\n";
// Compile the agal code into bytecode using agalminiassembler
fragmentShader = assembler.assemble(Context3DProgramType.FRAGMENT, code, 3);
//upload program to gpu
program.upload(vertexShader, fragmentShader);
//geometry data for the instances
var vertexData:Vector.<Number>=Vector.<Number>([
-0.3, -0.3, 0, // - 1st vertex x,y,z
0, 0.3, 1, // - 2nd vertex x,y,z
0.3, -0.3, 0 // - 3rd vertex x,y,z
]);
//per instance color data
var instanceColorData:Vector.<Number>=Vector.<Number>([
1.0, 0.0, 0.0, // - 1st instance r,g,b
0.0, 1.0, 0.0, // - 2nd instance r,g,b
1.0, 1.0, 1.0, // - 3rd instance r,g,b
0.7, 0.0, 1.0 // - 4th instance r,g,b
]);
//per instance translation data
var instanceTranslationData:Vector.<Number>=Vector.<Number>([
-0.3, -0.3, 0.0, // - 1st instance x,y,z
0.3, 0.3, 0.0, // - 2nd instance x,y,z
-0.3, 0.3, 0.0, // - 3rd instance x,y,z
0.3, -0.3, 0.0 // - 4th instance x,y,z
]);
vertexBuffer.uploadFromVector(vertexData, 0, 3);
instanceBufferColor.uploadFromVector(instanceColorData, 0, 4);
indexBuffer.uploadFromVector(Vector.<uint>([0, 1, 2]), 0, 3);
instanceBufferTranslation.uploadFromVector(instanceTranslationData, 0, 4);
//pass data to program
renderContext.setVertexBufferAt(0, vertexBuffer, 0, Context3DVertexBufferFormat.FLOAT_3);
renderContext.setVertexBufferAt(1, instanceBufferColor, 0, Context3DVertexBufferFormat.FLOAT_3);
renderContext.setVertexBufferAt(2, instanceBufferTranslation, 0, Context3DVertexBufferFormat.FLOAT_3);
//set active program
renderContext.setProgram(program);
renderContext.enableErrorChecking = true;
addEventListener(Event.ENTER_FRAME, render);
}
private function render( event:Event ):void
{
renderContext.clear(0.3, 0.2, 1, 1); // Clear the backbuffer by filling it with the given color
var instanceScalingData:Vector.<Number>=Vector.<Number>([
1.0, 1.0, 1.0, 1.0, // - 1st instance x,y,z,w
1.4, 1.4, 1.4, 1.0, // - 2nd instance x,y,z,w
0.6, 0.6, 0.6, 1.0, // - 3rd instance x,y,z,w
0.6, 0.6, 0.6, 1.0
]);
var m:Matrix3D = new Matrix3D();
m.copyRawDataFrom(instanceScalingData);
renderContext.setProgramConstantsFromMatrix("vertex",0,m,false);
//Draw three instances of the same geometry but with varying instance data specified using <code>vertexBufferForInstances</code>.
renderContext.drawTrianglesInstanced(indexBuffer,4);
renderContext.present(); // render the backbuffer on screen.
}
}
}
present | () | メソッド |
public function present():void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
バックレンダリングバッファーを表示します。
present() メソッドを呼び出すと、前回の present() 呼び出し以降のすべてのレンダリング操作の結果が表示され、新しいレンダリングサイクルが開始されます。present を呼び出した後に、clear() を呼び出してから、別の drawTriangles() を呼び出す必要があります。そうしないと、この関数は黄色と緑に対するレンダリングバッファーを交互にクリアするか、enableErrorChecking が true に設定されている場合は、例外がスローされます。
また、present() を呼び出すと、setRenderToBackBuffer() の呼び出しと同様に、レンダリングターゲットがリセットされます。
例外
Error — 描画の前にクリアする必要があります:前回 present() を呼び出してから、clear() を呼び出していない場合(連続して present() を呼び出すことはできません。必ず合間に clear() を呼び出す必要があります)。
| |
Error — 3768:バックグラウンドでの実行中、Stage3D API は使用できません。
|
setBlendFactors | () | メソッド |
public function setBlendFactors(sourceFactor:String, destinationFactor:String):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
既存のカラーによる描画処理の出力カラーをブレンドするために使用する係数を指定します。
ピクセルシェーダープログラムの出力(ブレンド元)カラーが、次の式に従ってそのピクセルで既存の(ブレンド先)カラーと混合されます。
result color = (source color * sourceFactor) + (destination color * destinationFactor)
ブレンド先カラーは、そのピクセルのレンダリングバッファーにある現在のカラーです。したがってこのカラーは、直近の clear() 呼び出しと、途中の drawTriangles() 呼び出しの結果設定されたものです。
setBlendFactors() は、ブレンド元カラーとブレンド先カラーを加算する前にこれらに乗算する係数を設定するために使用します。デフォルトのブレンド係数は、sourceFactor = Context3DBlendFactor.ONE および destinationFactor = Context3DBlendFactor.ZERO です。この結果、ブレンド元カラーによってブレンド先カラーが上書きされます(つまり、2 つのカラーのブレンドは行われません)。通常のアルファブレンディングの場合は、sourceFactor = Context3DBlendFactor.SOURCE_ALPHA と destinationFactor = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA を使用します。
この関数のパラメーターを設定するには、Context3DBlendFactor クラスに定義された定数を使用します。
パラメーター
sourceFactor:String — ブレンド元カラーに乗算される係数。デフォルトは、Context3DBlendFactor.ONE です。
| |
destinationFactor:String — ブレンド先カラーに乗算される係数。デフォルトは、Context3DBlendFactor.ZERO です。
|
例外
Error — 無効な列挙値です:sourceFactor または destinationFactor が、Context3DBlendFactor クラスに定義されている値のいずれかではない場合。
|
関連する API エレメント
例 ( この例の使用方法 )
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Context3D_setBlendMode extends Sprite
{
public const viewWidth:Number = 320;
public const viewHeight:Number = 200;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
private var sourceFactor:int = 6;
private var destinationFactor:int = 4;
private var blendFactors:Array = [Context3DBlendFactor.DESTINATION_ALPHA,
Context3DBlendFactor.DESTINATION_COLOR,
Context3DBlendFactor.ONE,
Context3DBlendFactor.ONE_MINUS_DESTINATION_ALPHA,
Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA,
Context3DBlendFactor.ONE_MINUS_SOURCE_COLOR,
Context3DBlendFactor.SOURCE_ALPHA,
Context3DBlendFactor.SOURCE_COLOR,
Context3DBlendFactor.ZERO];
public function Context3D_setBlendMode()
{
this.stage.addEventListener( KeyboardEvent.KEY_DOWN, keyHandler );
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.addEventListener( ErrorEvent.ERROR, contextError );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3 , 2,
0, 1, 3,
6, 4, 5,
5, 7, 6,
10, 8, 9,
9, 11, 10,
12, 15, 14,
12, 13, 15,
16, 17, 19,
16, 19, 18
] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 7;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b, a format
-1, 1, 0, 1, 1, 1, .5,
0, 1, 0, 1, 1, 1, .5,
-1, 0, 0, 1, 1, 1, .5,
0, 0, 0, 1, 1, 1, .5,
0, 1, 0, .8,.8,.8, .6,
1, 1, 0, .8,.8,.8, .6,
0, 0, 0, .8,.8,.8, .6,
1, 0, 0, .8,.8,.8, .6,
-1, 0, 0, 1, 0, 0, .5,
0, 0, 0, 0, 1, 0, .5,
-1,-1, 0, 0, 0, 1, .5,
0,-1, 0, 1, 0, 1, .5,
0, 0, 0, 0, 0, 0, .5,
1, 0, 0, 0, 0, 0, .5,
0,-1, 0, 0, 0, 0, .5,
1,-1, 0, 0, 0, 0, .5,
-.8,.8, 0, .6,.4,.2,.4,
.8,.8, 0, .6,.4,.2,.4,
-.8,-.8, 0, .6,.4,.2,.4,
.8,-.8, 0, .6,.4,.2,.4
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_4 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
render();
}
private function render():void
{
//Clear required before first drawTriangles() call
renderContext.clear( 1, 1, 1, 1 );
//Draw the back triangles
renderContext.setBlendFactors( Context3DBlendFactor.ONE, Context3DBlendFactor.ZERO ); //No blending
renderContext.drawTriangles( indexList, 0, 8 );
//Set blend
renderContext.setBlendFactors( blendFactors[sourceFactor], blendFactors[destinationFactor] );
//Draw the front triangles
renderContext.drawTriangles( indexList, 24, 2 );
//Show the frame
renderContext.present();
}
private function contextError( error:ErrorEvent ):void
{
trace( error.errorID + ": " + error.text );
}
private function keyHandler( event:KeyboardEvent ):void
{
switch ( event.keyCode )
{
case Keyboard.NUMBER_1:
if( --sourceFactor < 0 ) sourceFactor = blendFactors.length - 1;
break;
case Keyboard.NUMBER_2:
if( ++sourceFactor > blendFactors.length - 1) sourceFactor = 0;
break;
case Keyboard.NUMBER_3:
if( --destinationFactor < 0 ) destinationFactor = blendFactors.length - 1;
break;
case Keyboard.NUMBER_4:
if( ++destinationFactor > blendFactors.length - 1) destinationFactor = 0;
break;
}
trace( "Source blend factor: " + blendFactors[sourceFactor] + ", destination blend factor: " + blendFactors[destinationFactor] );
render();
}
}
}
setColorMask | () | メソッド |
public function setColorMask(red:Boolean, green:Boolean, blue:Boolean, alpha:Boolean):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
カラーをレンダリングバッファーに書き込む際に使用するマスクを設定します。
該当するカラーマスクのパラメーターが true であるカラー成分のみが、カラーがレンダリングバッファーに書き込まれたときに更新されます。例えば、setColorMask( true, false, false, false ) を呼び出すと、このカラーマスクを再度変更するまでは、カラーの赤色成分のみがバッファーに書き込まれます。カラーマスクによって clear() メソッドの動作が影響を受けることはありません。
パラメーター
red:Boolean — false を設定すると、赤のチャンネルへの変更がブロックされます。
| |
green:Boolean — false を設定すると、緑のチャンネルへの変更がブロックされます。
| |
blue:Boolean — false を設定すると、青のチャンネルへの変更がブロックされます。
| |
alpha:Boolean — false を設定すると、アルファチャンネルへの変更がブロックされます。
|
例 ( この例の使用方法 )
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
public class Context3D_setColorMask extends Sprite
{
public const viewWidth:Number = 320;
public const viewHeight:Number = 200;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
public function Context3D_setColorMask()
{
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 1, 2, 0, 3, 4 ] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b format
0, 0, 0, 1, 1, 1,
-1, 1, 0, 1, 1, 1,
1, 1, 0, 1, 1, 1,
1,-1, 0, 1, 1, 1,
-1,-1, 0, 1, 1, 1
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
renderContext.clear( .3,.3,.3,1 );
renderContext.drawTriangles( indexList, 0, 1 ); //Top triangle draws all colors, so is white
renderContext.setColorMask( true, false, false, false ); //Mask all but red channel
renderContext.drawTriangles( indexList, 3, 1 ); //Bottom triangle only updates red
//Show the frame
renderContext.present();
}
}
}
setCulling | () | メソッド |
public function setCulling(triangleFaceToCull:String):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
三角形カリングモードを設定します。
三角形は、表示面との相対的な方向関係に基づき、レンダリングパイプラインの初期段階でシーンから除外できることがあります。カリングを正常に行うため、モデルの外部から確認して、頂点を一貫した順序(時計回りまたは反時計回り)で指定します。
パラメーター
triangleFaceToCull:String — カリングモード。Context3DTriangleFace クラスに定義されている定数を 1 つ使用します。
|
例外
Error — 無効な列挙エラー:triangleFaceToCull が、Context3DTriangleFace クラスで定義されたどの値とも一致しない場合。
|
関連する API エレメント
setDepthTest | () | メソッド |
public function setDepthTest(depthMask:Boolean, passCompareMode:String):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
深度のテストに使用する比較のタイプを設定します。
ピクセルシェーダープログラムからのソースピクセル出力の深度が、深度バッファーにある現在の値と比較されます。比較の結果 false と評価されると、ソースピクセルが破棄されます。true の場合は、ソースピクセルがレンダリングパイプラインの次の手順であるステンシルのテストによって処理されます。さらに、depthMask パラメーターが true に設定されている場合は、深度バッファーがソースピクセルの深度で更新されます。
ソースピクセルと出力先ピクセルの深度の値を比較するテストを設定します。比較が true の場合、ソースピクセルが出力先ピクセルと合成されます。比較命令では、比較演算子がソースピクセル値と出力先ピクセル値の間の挿入演算子として適用されます。
パラメーター
depthMask:Boolean — true の場合、出力先の深度の値はソースピクセルを基に更新されます。
| |
passCompareMode:String — 深度の比較テストの操作。Context3DCompareMode のいずれかの値。
|
関連する API エレメント
setFillMode | () | メソッド |
setProgram | () | メソッド |
public function setProgram(program:Program3D):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
後続のレンダリングに使用する頂点シェーダープログラムおよびフラグメントシェーダープログラムを設定します。
パラメーター
program:Program3D — 使用する頂点プログラムおよびフラグメントプログラムを表す Program3D オブジェクト。
|
関連する API エレメント
例 ( この例の使用方法 )
renderContext オブジェクトは Context3D クラスのインスタンスです。この例のプログラムは、Adobe Graphics Assembly Language(AGAL)で記述されています。
//A simple vertex program in AGAL
const VERTEX_SHADER:String =
"m44 op, va0, vc0 \n" +
"mov v0, va1";
//A simple fragment (or pixel) program in AGAL
const FRAGMENT_SHADER:String = "mov oc, v0";
var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
var programPair:Program3D;
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
setProgramConstantsFromByteArray | () | メソッド |
public function setProgramConstantsFromByteArray(programType:String, firstRegister:int, numRegisters:int, data:ByteArray, byteArrayOffset:uint):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11.1, AIR 3.1 |
ByteArray に保存された値を使用するシェーダープログラムで必要となる定数を設定します。
頂点プログラムまたはフラグメントプログラムからアクセスできる定数を設定します。
パラメーター
programType:String — Context3DProgramType のいずれかの値。
| |
firstRegister:int — 最初に設定するシェーダープログラム定数のインデックス。
| |
numRegisters:int — 設定するレジスタの数。すべてのレジスタは 4 つの float 値として読み取られます。
| |
data:ByteArray — ソース ByteArray オブジェクト。
| |
byteArrayOffset:uint — ByteArray への読み取り用オフセット。
|
例外
TypeError — kNullPointerError(data が null の場合)。
| |
RangeError — kConstantRegisterOutOfBounds(最大数を超える数のシェーダー定数を設定しようとした場合)。
| |
RangeError — kBadInputSize(byteArrayOffset が data の長さ以上、またはdata のエレメントの数 - byteArrayOffset が numRegisters*16 よりも小さい場合)
|
関連する API エレメント
setProgramConstantsFromMatrix | () | メソッド |
public function setProgramConstantsFromMatrix(programType:String, firstRegister:int, matrix:Matrix3D, transposedMatrix:Boolean = false):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
Matrix3D に保存された値を使用して、シェーダープログラムで必要となる定数を設定します。
この関数を使用して、シェーダープログラムにマトリックスを渡します。この関数は、頂点プログラムまたはフラグメントプログラムで使用する 4 個の constant レジスタを設定します。マトリックスは行ごとにレジスタに割り当てられます。最初の constant レジスタにはマトリックスの先頭行が割り当てられます。頂点プログラムには 128 個のレジスタ、フラグメントプログラムには 28 個のレジスタを設定できます。
パラメーター
programType:String — シェーダープログラムのタイプ(Context3DProgramType.VERTEX または Context3DProgramType.FRAGMENT)。
| |
firstRegister:int — 設定する最初の constant レジスタのインデックス。Matrix3D には 16 個の値が含まれているので、4 個のレジスタが設定されます。
| |
matrix:Matrix3D — 定数値を含むマトリックス。
| |
transposedMatrix:Boolean (default = false) — true の場合、マトリックスエントリが転置された順序でレジスタにコピーされます。デフォルト値は false です。
|
例外
TypeError — Null ポインターエラーです:matrix が null の場合。
| |
RangeError — constant レジスタ数が範囲外です:シェーダーの constant レジスタの最大数を超えて設定しようとした場合。
|
詳細
関連する API エレメント
setProgramConstantsFromVector | () | メソッド |
public function setProgramConstantsFromVector(programType:String, firstRegister:int, data:Vector.<Number>, numRegisters:int = -1):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
シェーダープログラムの定数の入力を設定します。
頂点シェーダープログラムおよびフラグメントシェーダープログラムからアクセスできる定数の配列を設定します。Program3D に設定された定数は、constant レジスタとしてシェーダープログラム内でアクセスできます。各 constant レジスタは、4 つの浮動小数点値(x, y, z, w)で構成されています。したがって、data ベクトルではレジスタごとに 4 つのエントリが必要になります。頂点プログラムとフラグメントプログラムに設定できるレジスタの数は Context3DProfile によって異なります。
パラメーター
programType:String — シェーダープログラムのタイプ(Context3DProgramType.VERTEX または Context3DProgramType.FRAGMENT)。
| |
firstRegister:int — 設定する最初の constant レジスタのインデックス。
| |
data:Vector.<Number> — 浮動小数点定数の値。少なくとも numRegisters の 4 つのエレメントが data に存在する必要があります。
| |
numRegisters:int (default = -1) — 設定する定数の数。-1(デフォルト値)を指定して、使用可能なデータをすべて利用できるように十分なレジスタを設定します。
|
例外
TypeError — Null ポインターエラーです:data が null の場合。
| |
RangeError — constant レジスタ数が範囲外です:シェーダーの constant レジスタの最大数を超えて設定しようとした場合。
| |
RangeError — 入力サイズが正しくありません:data 内のエレメントの数が numRegisters*4 よりも小さい場合
|
詳細
関連する API エレメント
setRenderToBackBuffer | () | メソッド |
public function setRenderToBackBuffer():void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
レンダリングターゲットとしてバックレンダリングバッファーを設定します。drawTriangles() や clear() メソッドを後で呼び出すと、バックバッファーが更新されます。setRenderToTexture() メソッドを使用した後に、このメソッドを使用して、通常のレンダリングを再開します。
setRenderToTexture | () | メソッド |
public function setRenderToTexture(texture:flash.display3D.textures:TextureBase, enableDepthAndStencil:Boolean = false, antiAlias:int = 0, surfaceSelector:int = 0, colorOutputIndex:int = 0):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
レンダリングターゲットとして指定されたたテクスチャを設定します。
drawTriangles() や clear() メソッドを後で呼び出すと、バックバッファーではなく指定したテクスチャが更新されます。ミップマップが自動的に作成されます。setRenderToBackBuffer() を使用して、バックバッファーへの通常のレンダリングを再開します。
描画の前にクリアは不要です。クリア処理がない場合は、レンダリングコンテンツが保持されます。深度バッファーとステンシルバッファーもクリアされません。ただし、最初の描画時には強制的にクリアされます。present() を呼び出すと、ターゲットがバックバッファーにリセットされます。
パラメーター
texture:flash.display3D.textures:TextureBase — レンダリング先のターゲットテクスチャ。null に設定して、バックバッファーへのレンダリングを再開します(setRenderToBackBuffer() および present もターゲットをバックバッファーにリセットします)。
| |
enableDepthAndStencil:Boolean (default = false) — true の場合、深度およびステンシルをテストできます。false の場合、後続の描画操作では、深度およびステンシル状態はすべて無視されます。
| |
antiAlias:int (default = 0) — アンチエイリアスの品質。アンチエイリアスを無効にするには 0 を使用します。数値が高くなるとアンチエイリアスが向上しますが、必要な計算も増えます。現在、値はモバイルプラットフォームとソフトウェアレンダリングコンテキストで無視されます。
| |
surfaceSelector:int (default = 0) — 更新するテクスチャのエレメントを指定します。Texture オブジェクトは 1 面なので、0 (デフォルト値)を指定する必要があります。CubeTexture オブジェクトは 6 面なので、0 ~ 5 の整数を指定できます。
| |
colorOutputIndex:int (default = 0) — output カラーレジスタです。制限またはベースラインモードでは 0 である必要があります。0 でない場合は、output カラーレジスタを指定します。
|
例外
ArgumentError — surfeSelector パラメーターが一致しない場合。値は、2D テクスチャの場合は 0、立方体マップの場合は 0 ~ 5 にする必要があります。
| |
ArgumentError — texture が TextureBase クラス(Texture クラスまたは CubeTexture クラス)から派生していません。
| |
ArgumentError — colorOutputIndex は 0 から 3 の整数である必要があります。
| |
ArgumentError — この呼び出しには、標準プロファイルまたは上記で作成された Context3D が必要です。
|
関連する API エレメント
setSamplerStateAt | () | メソッド |
public function setSamplerStateAt(sampler:int, wrap:String, filter:String, mipfilter:String):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11.6, AIR 3.6 |
テクスチャサンプラーの状態を手動でオーバーライドします。
テクスチャサンプリングの状態は通常、setProgram を呼び出したときに設定されますが、この関数を使用してテクスチャサンプラーの状態をオーバーライドできます。プログラムでサンプラーの状態を変更できないようにする場合は、AGAL 内で ignoresamnpler ビットを設定し、この関数を使用してください。
パラメーター
sampler:int — 使用する sampler レジスタです。AGAL 内の sampler レジスタにマップされます。
| |
wrap:String — ラップモードです。Context3DWrapMode 内で定義されています。デフォルトは repeat です。
| |
filter:String — テクスチャフィルタリングモードです。Context3DTextureFilter 内で定義されています。デフォルトは nearest です。
| |
mipfilter:String — ミップマップフィルターです。Context3DMipFilter 内で定義されています。デフォルトは none です。
|
例外
Error — サンプラーが範囲外です。
| |
Error — ラップ、フィルター、マップフィルターの列挙が不正です。
| |
Error — オブジェクトが破棄されました:dispose() の呼び出しによって、または基盤のレンダリングハードウェアが喪失したために、この Context3D オブジェクトが破棄された場合。
|
関連する API エレメント
setScissorRectangle | () | メソッド |
public function setScissorRectangle(rectangle:Rectangle):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
シザー矩形(描画マスクの一種)を設定します。レンダラーはシザー矩形の内側の領域にのみ描画します。切り取りによってクリア操作は影響を受けません。
切り取りをオフにするには、null を渡します。
パラメーター
rectangle:Rectangle — 描画する矩形。矩形の位置とサイズ(ピクセル単位)を指定します。座標系の基点はビューポイントの左上隅で、正の値が右下方向に増加します(Flash の通常の表示座標系と同じ)。
|
例 ( この例の使用方法 )
三角形は、頂点バッファーとインデックスバッファーを使用して定義されます。頂点バッファーには、三角形の各頂点の位置と色の情報が含まれます。インデックスバッファーには、頂点バッファーへのインデックスが含まれます。3 つのインデックスによって 1 つの三角形が定義されます。例えば、頂点バッファーの最初の 3 つの点で構成される三角形は、インデックスバッファーに 0,1,2 として表示されます。
この簡単な例では、3D 変形は行われません。標準的な表示領域内のオブジェクト(原点を中心とする 2x2x2 の立方体ボリューム)のみが表示されます。ただし、標準的な 3D シーンをレンダリングするときは、遠近投影法または正投影法を使用して、レンダリングするオブジェクトをこの表示領域に投影します。
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.geom.Rectangle;
import flash.ui.Keyboard;
import flash.utils.Timer;
public class Context3D_ScissorRectangle extends Sprite
{
public const viewWidth:Number = 640;
public const viewHeight:Number = 480;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
private var scissorOn:Boolean = false;
private var toggler:Timer = new Timer( 750 );
public function Context3D_ScissorRectangle()
{
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
//Set up timer to turn scissoring on and off
toggler.addEventListener( TimerEvent.TIMER, toggleScissor );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3 , 2,
0, 1, 3
] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x, y, z r, g, b, a format
-1, 1, 0, 1,0,0,
1, 1, 0, 0,0,1,
-1,-1, 0, 0,1,0,
1,-1, 0, 1,0,1
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
render();
toggler.start();
}
private function render():void
{
//Clear required before first drawTriangles() call
renderContext.clear();
//Sciss a region excluding the outer 100 pixels of the viewport
var scissor:Rectangle = new Rectangle( 100, 100, viewWidth - 200, viewHeight - 200 );
if( scissorOn ) renderContext.setScissorRectangle( scissor ); //on
else renderContext.setScissorRectangle( null ); //off
//Draw the triangles
renderContext.drawTriangles( indexList, 0, 2 );
//Show the frame
renderContext.present();
}
private function toggleScissor( event:Event ):void
{
scissorOn = !scissorOn;
render();
}
}
}
setStencilActions | () | メソッド |
public function setStencilActions(triangleFace:String = "frontAndBack", compareMode:String = "always", actionOnBothPass:String = "keep", actionOnDepthFail:String = "keep", actionOnDepthPassStencilFail:String = "keep"):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
ステンシルモードおよびステンシル操作を設定します。
描画の各呼び出しに、8 bit のステンシル参照値を関連付けることができます。レンダリング中に、参照値とフレームバッファーに既に保存されている値を対応させてテストできます。テストの結果によって、描画アクションを制御したり、保存されているステンシル値の更新の有無や更新方法を制御できます。また、深度のテストによって、ステンシルのテストを実行するかどうかを制御できます。深度のテストが失敗した場合は、その結果を使用して、ステンシルバッファーで実行するアクションを制御できます。
ピクセル処理パイプラインでは、深度のテストが最初に行われます。深度のテストが失敗した場合、ステンシルバッファーの更新アクションは実行できますが、それ以上のステンシルバッファー値の評価はできません。深度のテストが成功した場合は、ステンシルのテストが行われます。ステンシルのテスト結果に応じて、他のアクションを実行できます。
ステンシルの参照値は、setStencilReferenceValue() を使用して設定されます。
パラメーター
triangleFace:String (default = "frontAndBack") — ステンシル操作で使用できる三角形の方向。Context3DTriangleFace のいずれかの値。
| |
compareMode:String (default = "always") — 現在のステンシルの参照値と出力先ピクセルのステンシル値の比較に使用するテスト演算子。出力先ピクセルのカラーと深度の更新は、この比較の結果が true の場合に実行されます。ステンシルのアクションは、以下のアクションパラメーターで要求されたとおりに実行されます。比較命令では、比較演算子が現在値と出力先の参照値の間の挿入演算子として適用されます(擬似コード:if stencilReference OPERATOR stencilbuffer then pass)。Context3DCompareMode クラスに定義されている定数を 1 つ使用します。
| |
actionOnBothPass:String (default = "keep") — 深度およびステンシルの比較がどちらも正常であった場合に実行されるアクション。Context3DStencilAction クラスに定義されている定数を 1 つ使用します。
| |
actionOnDepthFail:String (default = "keep") — 深度の比較結果が失敗した場合に実行されるアクション。Context3DStencilAction クラスに定義されている定数を 1 つ使用します。
| |
actionOnDepthPassStencilFail:String (default = "keep") — 深度の比較が正常で、ステンシルの比較が失敗した場合に実行されるアクション。Context3DStencilAction クラスに定義されている定数を 1 つ使用します。
|
例外
Error — 無効な列挙エラー:triangleFace が、Context3DTriangleFace クラスで定義されたどの値とも一致しない場合。
| |
Error — 無効な列挙エラー:compareMode が、Context3DCompareMode クラスで定義されたどの値とも一致しない場合。
| |
Error — 無効な列挙エラー:actionOnBothPass、actionOnDepthFail または actionOnDepthPassStencilFail が、Context3DStencilAction クラスで定義されたどの値とも一致しない場合。
|
関連する API エレメント
例 ( この例の使用方法 )
- ステンシルバッファーを 0 にクリアします。
- ステンシルアクションを、ステンシルテストが成功したらインクリメントするように設定します。
- ステンシル参照値を 0 に設定します。
- 三角形マスクを描画します。三角形が描画された場所ではすべて、ステンシルテストが成功します。これは、ステンシルバッファーが 0 にクリアされおり、参照値が 0 であるからです。その結果、ステンシルバッファーが 1 にインクリメントされます。この時点で、三角形マスクが描画されます。
- ステンシルアクションを変更し、後続の描画処理でステンシルバッファーが変更されないようにします。
- フルスクリーン矩形(マルチカラー)を描画します。ステンシル参照値が 0 のままなので、マスクされた領域でステンシルテストが失敗します。そのため、マスクされた領域を除くすべての領域で三角形が描画されます。
- ステンシル参照値を 1 に変更します。
- 別のフルスクリーン矩形(赤)を描画します。この時点で、マスクされた領域(1 にインクリメントされている)を除くすべての領域でステンシルテストが失敗します。そのため、マスクされた領域でのみ三角形が描画されます。
この例にマウスを合わせて、主な手順を順に確認してください。
package
{
import com.adobe.utils.AGALMiniAssembler;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.Context3DBlendFactor;
import flash.display3D.Context3DCompareMode;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DStencilAction;
import flash.display3D.Context3DTriangleFace;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.geom.Rectangle;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.ui.Keyboard;
import flash.utils.Timer;
public class Context3D_Stencil extends Sprite
{
public const viewWidth:Number = 350;
public const viewHeight:Number = 240;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private const VERTEX_SHADER:String =
"mov op, va0 \n" + //copy position to output
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
public function Context3D_Stencil()
{
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
non3DSetup();
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, true );
//Create vertex index list for the triangles
var triangles:Vector.<uint> = Vector.<uint>( [ 0, 3, 2,
0, 1, 3,
4, 7, 6,
4, 5, 7,
8, 9, 10
] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
//x, y, z r,g,b format
-1, 1, 0, 1,0,0,
1, 1, 0, 0,0,1,
-1,-1, 0, 0,1,0,
1,-1, 0, 1,0,1,
-1, 1, 0, .5,0,0,
1, 1, 0, .5,0,0,
-1,-1, 0, .5,0,0,
1,-1, 0, .5,0,0,
0, .7,.1, 0,0,0,
-.7,-.7,.1, 0,0,0,
.7,-.7,.1, 0,0,0
]);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
render();
}
private function render():void
{
//Clear, setting stencil to 0
renderContext.clear( .3, .3, .3, 1, 1, 0 );
//Draw stencil, incrementing the stencil buffer value
renderContext.setStencilReferenceValue( 0 );
renderContext.setStencilActions( Context3DTriangleFace.FRONT_AND_BACK,
Context3DCompareMode.EQUAL, Context3DStencilAction.INCREMENT_SATURATE );
if( state > 0 ) renderContext.drawTriangles( indexList, 12, 1 );
//Change stencil action when stencil passes so stencil buffer is not changed
renderContext.setStencilActions( Context3DTriangleFace.FRONT_AND_BACK,
Context3DCompareMode.EQUAL, Context3DStencilAction.KEEP );
//Draw quad -- doesn't draw where stencil has already drawn
if( state > 1 ) renderContext.drawTriangles( indexList, 0, 2 );
//Change the reference to 1 so this quad only draws into stenciled area
renderContext.setStencilReferenceValue( 1 );
if( state > 2 ) renderContext.drawTriangles( indexList, 6, 2 );
//Show the frame
renderContext.present();
}
//The rest of the code is for the example UI and timer
private function doState( event:TimerEvent ):void
{
switch (state)
{
case 0:
description.text = "Draw triangle with stencil action == increment";
state = 1;
break;
case 1:
description.text = "Draw the first plane where stencil == 0";
state = 2;
break;
case 2:
description.text = "Draw second plane where stencil == 1";
state = 3;
break;
case 3:
description.text = "Clear, setting stencil to 0";
state = 0;
break;
default:
description.text = "";
state = 0;
}
render();
}
private var state:int = 3;
private var stateTimer:Timer = new Timer( 1250 );
private var description:TextField = new TextField();
private function non3DSetup():void
{
//Setup timer to animate the stages of drawing the scene
stateTimer.addEventListener( TimerEvent.TIMER, doState );
this.stage.addEventListener( MouseEvent.MOUSE_OVER, function(event:Event):void{stateTimer.start()} );
this.stage.addEventListener( MouseEvent.MOUSE_OUT, function(event:Event):void{stateTimer.stop()} );
description.height = 30;
description.width = viewWidth;
this.addChild( description );
description.y = viewHeight + 15;
description.defaultTextFormat = new TextFormat( null, 18, 0xffffff );
description.text = "Mouse over to view.";
//Allows mouse-over events
var coverSprite:Sprite = new Sprite();
coverSprite.graphics.beginFill( 0, .01 )
coverSprite.graphics.lineTo( stage.stageWidth, 0 );
coverSprite.graphics.lineTo( stage.stageWidth, stage.stageHeight );
coverSprite.graphics.lineTo( 0, stage.stageHeight );
coverSprite.graphics.lineTo( 0, 0 );
this.addChild( coverSprite );
}
}
}
setStencilReferenceValue | () | メソッド |
public function setStencilReferenceValue(referenceValue:uint, readMask:uint = 255, writeMask:uint = 255):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
ステンシルのテストで使用するステンシル比較値を設定します。
この参照値の下位 8 bit のみが使用されます。ステンシルバッファー値の長さも 8 bit です。ステンシルバッファーをビットフィールドとして使用するには、readMask と writeMask を使用します。
パラメーター
referenceValue:uint — 参照値の比較テストで使用する 8 bit の参照値。
| |
readMask:uint (default = 255) — 比較の前に、現在のステンシルバッファー値と参照値の両方に適用される 8 bit のマスク。
| |
writeMask:uint (default = 255) — ステンシルバッファーの更新の前に、参照値に適用される 8 bit のマスク。
|
関連する API エレメント
setTextureAt | () | メソッド |
public function setTextureAt(sampler:int, texture:flash.display3D.textures:TextureBase):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
フラグメントプログラムのテクスチャ入力レジスタに使用するテクスチャを指定します。
フラグメントプログラムは最大 8 個のテクスチャオブジェクトの情報を読み取ることができます。この関数を使用して、フラグメントプログラムで使用する sampler レジスタの 1 つに Texture オブジェクトまたは CubeTexture オブジェクトを割り当てます。
注意:(setProgram を使用して)アクティブなフラグメントプログラムをテクスチャの使用が少ないシェーダーに変更する場合は、未使用のレジスタを null に設定してください。
setTextureAt( 7, null );
パラメーター
sampler:int — sampler レジスタのインデックス(値は 0 ~ 7)。
| |
texture:flash.display3D.textures:TextureBase — Texture インスタンスまたは CubeTexture インスタンスを使用できるようにするテクスチャオブジェクト。
|
詳細
関連する API エレメント
CubeTexture
setVertexBufferAt | () | メソッド |
public function setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int = 0, format:String = "float4"):void| 言語バージョン: | ActionScript 3.0 |
| ランタイムバージョン: | Flash Player 11, AIR 3 |
単一の頂点シェーダープログラムの入力に対応する頂点データコンポーネントを指定します。
setVertexBufferAt メソッドを使用して、頂点プログラムへの入力に属する VertexBuffer3D バッファーの各頂点に定義されているデータのコンポーネントを特定します。頂点プログラムの開発者が、頂点ごとに必要なデータ量を判断します。1 つまたは複数の VertexBuffer3D ストリームのデータが、頂点シェーダープログラムの attribute レジスタにマップされます。
頂点シェーダーで使用するデータの最小単位は 32 bit です。頂点ストリームに対するオフセット値は、32 bit の倍数で指定します。
例えば、プログラマーは次のデータを使用して各頂点を定義できます。
position: x float32
y float32
z float32
color: r unsigned byte
g unsigned byte
b unsigned byte
a unsigned byte
頂点が buffer という名前の1 つの VertexBuffer3D オブジェクトで定義されていると仮定すると、頂点は次のコードで頂点シェーダーに割り当てられます。
setVertexBufferAt( 0, buffer, 0, Context3DVertexBufferFormat.FLOAT_3 ); // attribute #0 will contain the position information setVertexBufferAt( 1, buffer, 3, Context3DVertexBufferFormat.BYTES_4 ); // attribute #1 will contain the color information
パラメーター
index:int — 頂点シェーダーの attribute レジスタのインデックス(0 ~ 7)。
| |
buffer:VertexBuffer3D — 頂点シェーダーに提供する頂点のソースデータを含むバッファー。
| |
bufferOffset:int (default = 0) — この属性の読み取りを開始する 1 つの頂点データの起点のオフセット。上述の例では、位置データは最初の属性なので、オフセットは 0 です。カラー属性は 3 つの 32 bit の位置の値を用いるので、カラーのオフセットは 3 です。オフセット値は、32 bit の単位で指定します。
| |
format:String (default = "float4") — この属性のデータ型を指定する Context3DVertexBufferFormat クラスの値。
|
例外
Error — 無効な列挙値です:形式が Context3DVertexBufferFormat クラスに定義されている値ではない場合。
| |
RangeError — attribute レジスタ数が範囲外です:index パラメーターが 0 ~ 7の範囲外の場合(シェーダーでは最大 8 個の頂点属性レジスタを使用できます)。
|
詳細
関連する API エレメント
package
{
import com.adobe.utils.AGALMiniAssembler;
import com.adobe.utils.PerspectiveMatrix3D;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.display3D.Context3DRenderMode;
import flash.display3D.Context3DTriangleFace;
import flash.display3D.Context3DVertexBufferFormat;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.events.ErrorEvent;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
public class Context3DExample extends Sprite
{
public const viewWidth:Number = 320;
public const viewHeight:Number = 200;
public const zNear:Number = 1;
public const zFar:Number = 500;
public const fov:Number = 45;
private var stage3D:Stage3D;
private var renderContext:Context3D;
private var indexList:IndexBuffer3D;
private var vertexes:VertexBuffer3D;
private var projection:PerspectiveMatrix3D = new PerspectiveMatrix3D();
private var model:Matrix3D = new Matrix3D();
private var view:Matrix3D = new Matrix3D();
private var finalTransform:Matrix3D = new Matrix3D();
//For rotating the cube
private const pivot:Vector3D = new Vector3D();
private const VERTEX_SHADER:String =
"m44 op, va0, vc0 \n" + // 4x4 matrix transform
"mov v0, va1"; //copy color to varying variable v0
private const FRAGMENT_SHADER:String =
"mov oc, v0"; //Set the output color to the value interpolated from the three triangle vertices
private var vertexAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var fragmentAssembly:AGALMiniAssembler = new AGALMiniAssembler();
private var programPair:Program3D;
public function Context3DExample()
{
this.stage.scaleMode = StageScaleMode.NO_SCALE;
this.stage.align = StageAlign.TOP_LEFT;
this.stage.nativeWindow.activate(); //AIR only
stage3D = this.stage.stage3Ds[0];
stage3D.x = 10;
stage3D.y = 10;
//Add event listener before requesting the context
stage3D.addEventListener( Event.CONTEXT3D_CREATE, contextCreated );
stage3D.addEventListener( ErrorEvent.ERROR, contextCreationError );
stage3D.requestContext3D( Context3DRenderMode.AUTO );
//Compile shaders
vertexAssembly.assemble( Context3DProgramType.VERTEX, VERTEX_SHADER, false );
fragmentAssembly.assemble( Context3DProgramType.FRAGMENT, FRAGMENT_SHADER, false );
}
//Note, context3DCreate event can happen at any time, such as when the hardware resources are taken by another process
private function contextCreated( event:Event ):void
{
renderContext = Stage3D( event.target ).context3D;
trace( "3D driver: " + renderContext.driverInfo );
setupScene();
}
private function setupScene():void
{
renderContext.enableErrorChecking = true; //Can slow rendering - only turn on when developing/testing
renderContext.configureBackBuffer( viewWidth, viewHeight, 2, false );
renderContext.setCulling( Context3DTriangleFace.BACK );
//Create vertex index list for the triangles forming a cube
var triangles:Vector.<uint> = Vector.<uint>( [
2,1,0, //front face
3,2,0,
4,7,5, //bottom face
7,6,5,
8,11,9, //back face
9,11,10,
12,15,13, //top face
13,15,14,
16,19,17, //left face
17,19,18,
20,23,21, //right face
21,23,22
] );
indexList = renderContext.createIndexBuffer( triangles.length );
indexList.uploadFromVector( triangles, 0, triangles.length );
//Create vertexes - cube faces do not share vertexes
const dataPerVertex:int = 6;
var vertexData:Vector.<Number> = Vector.<Number>(
[
// x,y,z r,g,b format
0,0,0, 1,0,0, //front face
0,1,0, 1,0,0,
1,1,0, 1,0,0,
1,0,0, 1,0,0,
0,0,0, 0,1,0, //bottom face
1,0,0, 0,1,0,
1,0,1, 0,1,0,
0,0,1, 0,1,0,
0,0,1, 1,0,0, //back face
1,0,1, 1,0,0,
1,1,1, 1,0,0,
0,1,1, 1,0,0,
0,1,1, 0,1,0, //top face
1,1,1, 0,1,0,
1,1,0, 0,1,0,
0,1,0, 0,1,0,
0,1,1, 0,0,1, //left face
0,1,0, 0,0,1,
0,0,0, 0,0,1,
0,0,1, 0,0,1,
1,1,0, 0,0,1, //right face
1,1,1, 0,0,1,
1,0,1, 0,0,1,
1,0,0, 0,0,1
]
);
vertexes = renderContext.createVertexBuffer( vertexData.length/dataPerVertex, dataPerVertex );
vertexes.uploadFromVector( vertexData, 0, vertexData.length/dataPerVertex );
//Identify vertex data inputs for vertex program
renderContext.setVertexBufferAt( 0, vertexes, 0, Context3DVertexBufferFormat.FLOAT_3 ); //va0 is position
renderContext.setVertexBufferAt( 1, vertexes, 3, Context3DVertexBufferFormat.FLOAT_3 ); //va1 is color
//Upload programs to render context
programPair = renderContext.createProgram();
programPair.upload( vertexAssembly.agalcode, fragmentAssembly.agalcode );
renderContext.setProgram( programPair );
//Set up 3D transforms
projection.perspectiveFieldOfViewRH( fov, viewWidth/viewHeight, zNear, zFar );
view.appendTranslation( 0, 0, -2 ); //Move view back
model.appendTranslation( -.5, -.5, -.5 ); //center cube on origin
this.stage.addEventListener( Event.ENTER_FRAME, render );
}
private function render( event:Event ):void
{
//Rotate model on each frame
model.appendRotation( .5, Vector3D.Z_AXIS, pivot );
model.appendRotation( .5, Vector3D.Y_AXIS, pivot );
model.appendRotation( .5, Vector3D.X_AXIS, pivot );
//Combine transforms
finalTransform.identity();
finalTransform.append( model );
finalTransform.append( view );
finalTransform.append( projection );
//Pass the final transform to the vertex shader as program constant, vc0
renderContext.setProgramConstantsFromMatrix( Context3DProgramType.VERTEX, 0, finalTransform, true );
//Clear is required before drawTriangles on each frame
renderContext.clear( .3,.3,.3 );
//Draw the 12 triangles that make up the cube
renderContext.drawTriangles( indexList, 0, 12 );
//Show the frame
renderContext.present();
}
private function contextCreationError( error:ErrorEvent ):void
{
trace( error.errorID + ": " + error.text );
}
}
}
Tue Jun 12 2018, 10:34 AM Z
継承されるパブリックプロパティを隠す
継承されるパブリックプロパティを表示