我在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);
}
}
我无法理解为什么它们会消失,以及为什么它们在重新启动后会再次显示新的着色器。
答案 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()事件,但重写它以满足您的需求并不是一件大事。 基本上,您只需将设置着色器事件排队,直到下一个渲染周期发生。
不是最漂亮的解决方案,但它会在下一次框架更新之前完成; - )