Android 渲染器:从文件而不是资源中读取纹理?

Android 渲染器:从文件而不是资源中读取纹理?,android,opengl-es,textures,renderer,glsurfaceview,Android,Opengl Es,Textures,Renderer,Glsurfaceview,我在GLSurfaceView.Renderer::onSurfaceCreated函数中找到了大量如何从资源中读取纹理的示例 如果我想在“活动”中从库中打开文件,该怎么办?我在MyGLRenderer中添加了函数public int loadTexture(字符串文件名),它看起来像: public int loadTexture (String filename) { final BitmapFactory.Options options = new BitmapFactory.Op

我在
GLSurfaceView.Renderer::onSurfaceCreated
函数中找到了大量如何从资源中读取纹理的示例
如果我想在“活动”中从库中打开文件,该怎么办?我在MyGLRenderer中添加了函数
public int loadTexture(字符串文件名)
,它看起来像:

public int loadTexture (String filename)
{
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inScaled = false;

    // Read in the resource
    final Bitmap bitmap = BitmapFactory.decodeFile(filename, options);

    int[] textureId = new int[1];

    GLES20.glGenTextures ( 1, textureId, 0 );
    GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, textureId[0] );

    GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR );
    GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR );
    GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE );
    GLES20.glTexParameteri ( GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE );

    GLES20.glEnable(GLES20.GL_BLEND);
    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);

    try{
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
    }
    catch(Exception ex)
    {
        ex.printStackTrace();
    }

    textures[0] = textureId[0];

    return textureId[0];
}  
MyActivity
类中,当用户从库中打开文件时,我调用

((MyGLSurfaceView)mGLView).getRenderer().loadTexture(filePath);
问题是glGenTextures不会生成纹理。正如我所读到的,这是因为一些上下文丢失了。但是
loadTexture
函数中的代码不需要任何上下文! 官方文档教程只考虑从资源中创建纹理。 github上有许多示例项目,但它们也可以在
onSurfaceCreated
中上载资源的纹理


请给我一些关于代码的链接,其中纹理在运行时加载到
GLSurfaceView.Renderer
。我对Android非常了解,所以一般的建议“创建新线程并传递gl上下文”是不够的

也是俄罗斯人?!=)GLSurfaceView在另一个线程中工作。您只需要在创建GL上下文时加载纹理,因此在不同线程中尝试使用OpenGL是非常糟糕的(更准确地说,这很困难)。@ghostman:那么在不同线程中使用OpenGL的方法是什么?p、 乌克兰:)若你们有一个简单的场景,那个么只需将所有补丁传递到渲染器构造函数中。或者您可以创建任务:指定一些用于加载任务的接口,并从另一个线程设置它(这里您需要同步线程)。draw()中的渲染器检查是否有任务并执行它们。然后删除已完成的任务。
public synchronized void addTask(final ITask task){mTasks.add(task);}
或创建包含所有逻辑并将其传递到构造函数或类似任务中的类场景。