2

例えば...

複数のテクスチャ(基本的には一意のスプライト)を必要とするアプリケーションを開発している場合、アプリケーションで使用する個々のテクスチャごとに新しい(とを使用しcontext3D.createProgram();)を呼び出してアセンブルする必要がありますか?Program3DVertexShaderAssemblerFragmentShaderAssembler

Program3D通常、エンジン内でどのように機能しますか?1つのプログラムですべてを実行しますか、それともテクスチャモデルマップごとに1つのプログラムを使用しますか?

そして、各フレーム()ではなく、Program3D初期化時間()中に1回だけ作成する必要があると仮定するのは正しいですか?Event.ADDED_TO_STAGEEvent.ENTER_FRAME

4

2 に答える 2

3

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

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

使用例:

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

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

最初に水を描き、次に地形を描きます。それぞれ異なるシェーダーを使用します。私の TerrainShader には、砂、岩、土のテクスチャなど、複数のテクスチャがあります。シェーダーは、特定の時間に使用するテクスチャを決定します。たとえば、頂点の高さが 10 未満の場合は、砂のテクスチャを使用します。

そのため、一度プログラムを作成して、必要なときに使用してください。

これが正しい方法で役立つことを願っています。

于 2011-11-15T11:36:48.927 に答える
1

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

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

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

于 2011-10-20T16:34:01.103 に答える