2
例えば

...低レベルのAGALでコーディングしている間に、Textureごとに新しいProgram3Dを作成する必要がありますか?

私はそれに複数のテクスチャを必要とするアプリケーションを開発しています(基本的にユニークなスプライト、)、私はcontext3D.createProgram();を呼び出し、VertexShaderAssemblerで新しいProgram3Dを組み立てるために必要なんとした場合a FragmentShaderAssembler)を、アプリケーションで使用したい個々のテクスチャごとに作成します。通常、エンジン内Program3D作業を行いどのよう

?い全体を実行するか、またはそれは1つのプログラムを使用しないテクスチャモデルをマップごとに 1つのプログラム?

そして、私はあなたが右のみ、初期化時間(Event.ADDED_TO_STAGE)の間、およびない各フレーム(Event.ENTER_FRAME)中に一度Program3Dを作成する必要があることを前提とするために修正していますか?

答えて

3

1つのプログラム(シェーダ)では、複数のテクスチャを持つことができます。通常は、持っているシェーダごとにプログラムを作成します。 たとえば、私のゲームでは、地形の照明、テクスチャリング、および着色のためのシェーダ(プログラム)が1つあります。私は水のための別のシェーダー(プログラム)を持っています。

したがって、プログラムは一度作成されますが、私はcontext3dに、そのシーンを描画する前にどのプログラムを使うかを教えています。そうすれば、現在のプログラムで描画しようとしているものが描画されます。

使用例:

context3d.setProgram(WaterShader); 
water.drawTriangles(); 

context3d.setProgram(TerrainShader) 
terrain.drawTriangles(); 

私はそれぞれ異なるシェーダを使用して、最初にして地形を水を引きます。 TerrainShaderに複数のテクスチャがあります。砂、岩および汚れのテクスチャ。シェーダは、指定された時間にどのテクスチャを使用するかを決定します。例えば。頂点の高さが<の場合は、砂のテクスチャを使用します。

したがって、プログラムを一度作成し、必要に応じて使用してください。

これが正しい方法でお役に立てば幸いです。

1

テクスチャごとに新しいProgram3Dは必要ありません。レンダラーは、drawTriangles()を呼び出すたびに最後に設定されたプログラムを使用します。異なるテクスチャを別々に処理して別のフラグメントシェーダが必要な場合は、複数のProgram3Dオブジェクトが必要ですが、オブジェクトやテクスチャごとに異なるシェーダが必要な場合はまれです。

エンジンを作成していないため、これが通常どのように行われるのかはわかりません。私は、異なるクラスのモデル、環境マップなどのために異なるProgram3Dオブジェクトを持っていると思います。エンティティごとに1つではないでしょう。あなたは約4000のProgram3Dオブジェクトに制限されています。

はい、事前にProgram3Dオブジェクトを作成して初期化する必要があります。レンダリング中に、Context3D.setProgram()を呼び出してアクティブなプログラムを指定します。このプログラムは、変更するまでレンダリングに使用されます。

+0

ああ、私がContext3D.setProgram(...)と呼ぶ順序は、おそらく、望ましいZ-Depth結果を得るために重要なのでしょうか? – bigp

+0

これはまた、私が想像するProgram3Dの間で交互に切り替えるときにContext3Dをクリアする必要はないことを意味します。特に、1つのレンダーパスが別の以前のパスをオーバレイするだけの場合はどうですか? – bigp

+0

デプステストが機能するには、正しい順序で物を描く必要があります。これにより、setProgram()を呼び出す順序も決まります。 present()呼び出しごとに1回だけクリアする必要があります。 –