Domanda

Ad esempio ...

Se sto sviluppando un'applicazione che richiede più di una texture (sprite univoci, fondamentalmente), devo chiamare context3D.createProgram(); e assemblare un nuovo Program3D ( con un VertexShaderAssembler e un FragmentShaderAssembler ) per ogni singola texture che desidero utilizzare nell'applicazione?

Come funziona generalmente un Program3D all'interno di un motore?Un programma esegue l'intera operazione o utilizza un programma per trame , modelli , mappe ?

E ho ragione di presumere che sia necessario creare il Program3D solo una volta durante il tempo di inizializzazione (Event.ADDED_TO_STAGE) e non durante ogni frame (Event.ENTER_FRAME), giusto?

È stato utile?

Soluzione

Per un programma (shader) puoi avere più trame.Di solito scrivi un programma per ogni shader che hai. Ad esempio nel mio gioco ho uno shader (programma) per l'illuminazione del terreno, la texture e la colorazione.Ho un altro shader (programma) per l'acqua.

Quindi i programmi sono fatti una volta, ma dico a context3d quale programma usare prima di disegnare la scena.In questo modo disegnerà tutto ciò che sto per disegnare con il programma corrente.

Esempio di utilizzo:

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

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

Disegno prima l'acqua e poi il terreno, ciascuno utilizzando uno shader diverso. Il mio TerrainShader ha più trame, ad es.texture di sabbia, roccia e sporcizia.Lo shader decide quale texture usare in un dato momento.Per esempio.se l'altezza del vertice è <10, usa la texture sabbia.

Quindi, crea i programmi una volta e usali quando necessario.

Spero che questo ti aiuti nel modo giusto.

Altri suggerimenti

Non è necessario un nuovo Program3D per ogni texture.Il renderizzatore usa l'ultimo programma impostato ogni volta che chiami drawTriangles ().Se è necessario trattare determinate trame in modo diverso in modo tale da richiedere uno shader di frammento diverso, è necessario più di un oggetto Program3D, ma sarebbe un raro caso in cui sarebbe necessario uno shader diverso per ogni oggetto e trama.

Non avendo scritto un motore, non posso dirti come sarebbe fatto normalmente.Penso che avresti diversi oggetti Program3D per diverse classi di modelli, mappe ambientali, ecc. Probabilmente non uno per entità.Sei limitato a circa 4000 oggetti Program3D.

Sì, dovresti creare e inizializzare i tuoi oggetti Program3D in anticipo.Durante il rendering, chiamate Context3D.setProgram () per specificare il programma attivo.Quel programma viene utilizzato per il rendering finché non lo modifichi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top