2

例如...在低級AGAL中進行編碼時,是否需要爲每個紋理創建一個新的Program3D?

如果我正在開發,需要在它不止一個紋理(獨特的精靈,基本上)的應用程序,做我需要調用context3D.createProgram();和組裝新Program3DVertexShaderAssembler和一個FragmentShaderAssembler)對於我希望在應用程序中使用的每個單獨紋理?

Program3D如何在典型的引擎中工作?難道一個程序運行整個事情,或者它使用一個程序紋理模型映射

而且我是正確的假設,你只需要在初始化時間(Event.ADDED_TO_STAGE)一次創建Program3D,而不是每幀(Event.ENTER_FRAME)期間,對不對?

回答

3

對於一個程序(着色器),你可以有多個紋理。通常你爲每個着色器編寫一個程序。例如在我的遊戲中,我有一個着色器(程序)用於地形照明,紋理和着色。我還有另一個着色器(程序)。

所以程序只做一次,但是我在繪製場景之前告訴context3d要使用哪個程序。這樣一來,它就會畫出我要用當前程序繪製的任何東西。

實例:

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

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

予先畫出水,然後地形,每個使用不同的着色器。 我的TerrainShader中有多個紋理,例如沙子,岩石和泥土紋理。着色器決定在給定時間使用哪個紋理。例如。如果頂點的高度爲< 10,則使用沙紋理。

因此,創建一次程序並在需要時使用它們。

我希望這可以幫助你以正確的方式。

1

對於每個紋理,您不需要新的Program3D。無論何時調用drawTriangles(),渲染器都會使用最後一個程序集。如果您需要以不同的方式處理特定的紋理,以至於您需要不同的片段着色器,那麼您確實需要多個Program3D對象,但是對於每個對象和紋理都需要不同的着色器的情況很少見。

沒有寫過引擎,我不能告訴你這是怎麼做的典型。我想你會爲不同類型的模型,環境地圖等設置不同的Program3D對象。可能不是每個實體一個。您僅限於約4000個Program3D對象。

是的,您應該提前創建並初始化您的Program3D對象。在渲染過程中,您調用Context3D.setProgram()來指定活動程序。該程序用於渲染,直到你改變它。

+0

Ah k,所以我調用Context3D.setProgram(...)的順序對獲得所需的Z-Depth結果可能很重要,對嗎? – bigp

+0

這也意味着,當我在Program3D之間交替時,我不需要清除Context3D,特別是如果一個渲染通道只是覆蓋另一個先前的通道? – bigp

+0

您需要按照正確的順序繪製東西才能使深度測試正常工作。這也可能決定您調用setProgram()的順序。您只需要在每個當前()調用中清除一次。 –

相關問題