1

Android(3D OpenGLライブラリ)で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 に答える