我是 Android 开发的新手,并尝试使用 OpenGL ES 2.0 来显示 3D 对象并在其上贴图纹理。当我使用从资源图像获得的纹理时,一切正常。作为下一步,我尝试使用照片库中的图像来动态更改纹理。这是我所做的:
public class DesignTab extends Fragment implements OnMenuItemClickListener {
private static final int SELECT_PHOTO = 100;
private GLSurfaceView mGLView;
// onCreate, onCreateView here where mGLView is created
@Override
public void onPause() {
super.onPause();
mGLView.onPause();
}
@Override
public void onResume() {
super.onResume();
mGLView.onResume();
}
// popup menu event handler here that calls onPhotoGalleryAction()
public void onPhotoGalleryAction() {
Intent photoPickerIntent = new Intent(Intent.ACTION_GET_CONTENT);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);
}
public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case SELECT_PHOTO:
Uri selectedImage = imageReturnedIntent.getData();
InputStream imageStream = getActivity().getContentResolver().openInputStream(selectedImage);
Bitmap selectedImageBitmap = BitmapFactory.decodeStream(imageStream);
mGLView.getRenderer().setTexture(selectedImageBitmap); // this does NOT call OpenGL API but store bitmap object
mGLView.queueEvent(new Runnable() {
@Override
public void run() {
mGLView.getRenderer().applyTexture(); // this calls OpenGL APIs to apply texture from stored bitmap
});
}
}
我将 mGLView.getRenderer().applyTexture() 放在 GLSurfaceView.queueEvent 中以在 OpenGL 渲染线程中运行它,其中实际的纹理映射是使用 OpenGL API 完成的。但是当我运行代码时,我收到了以下 LogCat 错误消息:
call to OpenGL ES API with no current context (logged once per thread)
和警告信息:
EGL_emulation eglSurfaceAttrib not implemented
虽然它没有使应用程序崩溃,但我没有得到使用所选图像进行纹理映射的预期结果。我很确定 OpenGL 纹理映射代码不是问题,因为它与资源图像一起使用。
我怀疑这个“没有当前上下文”错误是因为我试图在 GLSurfaceView 由于加载照片库而暂停(因此上下文被破坏)时调用 OpenGL API。所以我setPreserveEGLContextOnPause(true);
在创建渲染器之前放了,这并没有解决问题。任何帮助将不胜感激。