android GLSurfaceView.Renderer:从文件中读取纹理,而不是从资源中读取纹理?

时间:2015-12-06 21:18:17

标签: android opengl-es textures renderer glsurfaceview

好吧,我发现很多示例如何从GLSurfaceView.Renderer::onSurfaceCreated函数中的资源中读取纹理。
如果我想在我的活动中打开库中的文件怎么办?我将函数public int loadTexture (String filename)添加到我的MyGLRenderer中,它看起来像是:

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上下文”是不够的。 :)

0 个答案:

没有答案