2012-08-03 1 views
1

나는 Rajawali를 Android (3d Opengl 라이브러리)에서 사용합니다.OpenGL ES 쉐이더를 동적으로 다시로드

소재를 새로 고침하려고합니다. (다른 쉐이더를 동적으로 사용하기 시작합니다.) 그러나 객체에 런타임시 새 재료를 설정하면 사라집니다 (전원 버튼으로이 객체를 화면에 표시 한 후 새 객체로 다시 표시됨). 자료).

새 소재를 설정 한 후 객체의 속성 (함수 재로드)을 다시로드하려고 시도했지만 도움이되지 않습니다. 다른 객체에 reload()을 호출하면 해당 객체도 사라집니다. 재료

기능 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입니다() 이벤트를하지만 필요에 맞게 재 작성하기 위해 많은 노력해서는 안됩니다. 기본적으로 다음 렌더링 사이클이 발생할 때까지는 set shader 이벤트를 큐에 넣기 만하면됩니다.

가장 좋은 해결책은 아니지만 다음 프레임 워크가 업데이트 될 때까지 할 것입니다 .-)

+0

매력처럼 작동합니다. 하지만, 더 좋은 방법이 있습니까? – defhlt