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);}
或创建包含所有逻辑并将其传递到构造函数或类似任务中的类场景。