gpt4 book ai didi

android - Opengl ES 动态重新加载着色器

转载 作者:行者123 更新时间:2023-11-29 18:09:00 27 4
gpt4 key购买 nike

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

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

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

Material (shaders 类)中的函数 reload() 是:

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

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

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

最佳答案

问题是您正试图在渲染周期的中间添加一个对象。当 Material 尝试创建着色器时,会返回一个错误。

目前正在对 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() 事件,但重写它以满足您的需要并不费力。基本上,您只需将设置的着色器事件排队,直到下一个渲染周期发生。

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

关于android - Opengl ES 动态重新加载着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11798591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com