2012-08-03 292 views
1

我在android(3d opengl庫)中使用Rajawali。我試圖重新加載材質(動態地開始使用不同的着色器) - 但是當我將新材質(在運行時)設置爲對象時,它會消失(在通過電源按鈕關閉屏幕之後,此對象會再次顯示新的材料)。我試圖重新加載對象的屬性(函數重載),但它沒有幫助(如果我在其他對象上調用reload()-它們也會消失=))。Opengl ES動態重載着色器

功能reload()在材料(shaders類)是:

public void reload() { 
     setShaders(mUntouchedVertexShader, mUntouchedFragmentShader); 

     for(int i=0; i<mNumTextures; i++) { 
      addTexture(mTextureInfoList.get(i), true, true); 
     } 
    } 

我不明白他們爲什麼消失了,爲什麼他們重​​新開始新的着色器後再次出現。

回答

3

問題是,您正試圖在渲染週期的中間添加一個對象。 當材質試圖創建着色器時,返回錯誤。

目前正在對API進行工作,以使其更加用戶友好。在此期間,你可以做一些與此類似:

private boolean mSetShaders; 

public void onTouch() { 
    // -- boolean that indicates that an object should be added onDrawFrame() 
    mSetShaders = true; 
} 

public void onDrawFrame(GL10 glUnused) { 
    super.onDrawFrame(glUnused); 
    if(mSetShaders) { 
     // ... set your shaders here ... 
     mSetShaders = false; 
    } 
} 

這個例子是onTouch()事件,但它不應該是一個很大的努力去改寫它,以滿足您的需求。 基本上,你只是排隊設置着色器事件,直到下一個渲染週期發生。

不是最漂亮的解決方案,但它會做,直到下一個框架更新;-)

+0

工程就像一個魅力。但請告訴,有沒有更好的方法呢? – defhlt 2014-10-02 11:17:19