0

我是 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);在创建渲染器之前放了,这并没有解决问题。任何帮助将不胜感激。

4

1 回答 1

0

Android 上对 OpenGL ES 的所有调用都必须从单个线程进行。您可能没有意识到 GLSurfaceView 会自动提供该线程,因此从任何其他线程进行的任何 OpenGL ES 调用都会导致这些问题。本文更详细地讨论了这一点:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1

于 2013-09-03T05:57:45.297 回答