Opengl ES动态重新加载着色器

时间:2012-08-03 15:20:35

标签: android opengl-es shader rajawali

我在android(3d opengl库)中使用Rajawali。

我正在尝试重新加载材质(动态开始使用不同的着色器) - 但是当我将新材质(在运行时)设置到对象时它会消失(在电源按钮上的\ off屏幕后,此对象再次显示新材质)。

设置新材料后,我正在尝试重新加载对象的属性(函数重新加载),但它没有帮助(如果我在其他对象上调用reload() - 它们也会消失=))。

材料(reload()类)中的函数shaders是:

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

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

我无法理解为什么它们会消失,以及为什么它们在重新启动后会再次显示新的着色器。

1 个答案:

答案 0 :(得分: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()事件,但重写它以满足您的需求并不是一件大事。 基本上,您只需将设置着色器事件排队,直到下一个渲染周期发生。

不是最漂亮的解决方案,但它会在下一次框架更新之前完成; - )