2012-08-03 265 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