1

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

我正在尝试重新加载材质(开始动态使用不同的着色器) - 但是当我将新材质(在运行时)设置为对象时,它会消失(通过电源按钮打开/关闭屏幕后,此对象会再次出现新材质)。

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

reload()材料(shaders类)中的功能是:

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

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

我不明白为什么它们会消失以及为什么在使用新的着色器重新启动后它们又会出现。

4

1 回答 1

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() 事件,但重写它以满足您的需要应该不是很大的努力。基本上,您只需将设置着色器事件排队,直到下一个渲染周期发生。

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

于 2012-08-16T21:40:41.493 回答