标签: glsurfaceview

具有可绘制背景的Android GLSurfaceView

我有一个带有drawable作为背景的GLSurfaceView,但是在没有surfaceView.setZOrderOnTop(true)的情况下渲染时只有背景可见

我需要避免使用setZOrderOnTop(true),因为在GLSurfaceView上使用静态TextView.

有什么建议让这个工作?

android background opengl-es drawable glsurfaceview

5
推荐指数
2
解决办法
9655
查看次数

glReadPixels使用起来太慢了

我正在使用方法 glReadPixels定期拍摄快照.我需要定期拍摄此快照,以便按照我的应用要求保存我的数据.drawFrameGLSurfaceView.Renderer

然而,glReadPixels性能确实很慢并且显示出滞后.以下是我使用该方法的方法:

gl.glReadPixels(0, 0, 1280, 752, GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE, bb);
Run Code Online (Sandbox Code Playgroud)

有替代品可以使用glReadPixels吗?如何在不造成滞后的情况下保存图像?

android opengl-es glreadpixels glsurfaceview

5
推荐指数
1
解决办法
5317
查看次数

在2个GLSurfaceViews之间共享EGL2.0上下文导致Android平板电脑上的EGL_BAD_ACCESS

我尝试通过以下代码分享2个GLSurfaceViews的EGL上下文:

createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
    EGLContext shared = ...; // a cached egl context
    int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
    EGLContext context = egl.eglCreateContext(display, eglConfig, shared == null ? EGL10.EGL_NO_CONTEXT : shared,
        attrib_list);
    return context;
  }
}
Run Code Online (Sandbox Code Playgroud)

该代码适用于大多数Android手机(操作系统> = 2.2),但在所有测试的平板电脑上都失败了.

01-12 18:33:35.381:E/AndroidRuntime(12171):致命异常:GLThread 11

01-12 18:33:35.381:E/AndroidRuntime(12171):java.lang.RuntimeException:eglMakeCurrent失败:EGL_BAD_ACCESS

01-12 18:33:35.381:E/AndroidRuntime(12171):在android.opengl.GLSurfaceView $ EglHelper.throwEglException(GLSurfaceView.java:1146)

由于我声明了LOCAL_LDLIBS:= - lGLESv2,因此EGL是2.0上下文.

为什么它在平板电脑上失败(xoom,galaxy,lg,sony等)

任何见解都表示赞赏.

android opengl-es android-ndk glsurfaceview opengl-es-2.0

5
推荐指数
1
解决办法
6995
查看次数

PopupWindow中的GLSurfaceView

我需要一个添加GLSurfaceViewFrameLayout一个PopupWindow.问题是,在内部,SurfaceView从当前窗口请求令牌.PopupWindows没有他们自己的令牌,所以我从弹出父母那里给它一个令牌,如下所示:

class MySurfaceView extends GLSurfaceView {
   ...
  @Override
  public IBinder getWindowToken() {
      // I set the mPopupParent manually to be the parent of the PopupWindow in question
      return mPopupParent.getWindowToken();
    }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

现在,即使MySurfaceView添加到了FrameLayout内容中PopupWindow,它也不会在那里绘制.它借鉴了我从中得到令牌的观点.

如何在实际添加的布局上绘制它?

编辑:只是为了给出更多细节,如果它有所不同,mPopupParent是一个IME视图(基本上是一个键盘).

android popupwindow glsurfaceview

5
推荐指数
1
解决办法
606
查看次数

Android和OpenGL在启动时提供黑框

我正在为一个拥有GLSurfaceView和GLSurfaceView.Renderer的客户编写一个Android应用程序.

我的整个OpenGL工作正常(它基本上是另一个开发人员首先在iOS上编写的端口).除了一件事.当加载视图并因此加载OpenGL的东西时,我的背景快速闪烁黑色,然后OpenGL开始正确渲染(使用我的背景).所以我做的是:

在onSurfaceCreated中我从这开始:

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.9f + 0.1f * (21.0f / 255),
            0.9f + 0.1f * (36.0f / 255),
            0.9f + 0.1f * (31.0f / 255), 1.0f);

    // Here goes my other stuff, if I comment all my other stuff out I still get the flash at startup
}
Run Code Online (Sandbox Code Playgroud)

在我的onDrawFrame方法中,我这样做:

@Override
public void onDrawFrame(GL10 gl) {

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    // My stuff, again, if I comment all this stuff out I still get the …
Run Code Online (Sandbox Code Playgroud)

android renderer glsurfaceview opengl-es-2.0

5
推荐指数
1
解决办法
1642
查看次数

当我们根本不使用GLSurface时,继续接收eglMakeCurrent失败的EGL_BAD_ALLOC报告

我的应用程序一直在关于Android 4.4.x设备,三星,xiaomi的崩溃报告......

java.lang.IllegalStateException: eglMakeCurrent failed EGL_BAD_ALLOC
   at android.view.HardwareRenderer$GlRenderer.createSurface(HardwareRenderer.java:1354)
   at android.view.HardwareRenderer$GlRenderer.createEglSurface(HardwareRenderer.java:1241)
   at android.view.HardwareRenderer$GlRenderer.initialize(HardwareRenderer.java:1058)
   at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1580)
   at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1030)
   at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5639)
   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
   at android.view.Choreographer.doCallbacks(Choreographer.java:574)
   at android.view.Choreographer.doFrame(Choreographer.java:544)
   at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
   at android.os.Handler.handleCallback(Handler.java:733)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:136)
   at android.app.ActivityThread.main(ActivityThread.java:5047)
   at java.lang.reflect.Method.invokeNative(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:515)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:807)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:623)
   at dalvik.system.NativeStart.main(NativeStart.java)
Run Code Online (Sandbox Code Playgroud)

我做了一些谷歌,但我的应用程序没有使用任何GLSurfaceView,只使用Android标准视图模块.

也许是因为我正在使用Fragment并持有太多的儿童观点?

在此输入图像描述

这不会一直发生.但当它发生时,我点击启动器图标,它只是一直崩溃.

我应该搜索的任何方向?

任何回复赞赏.

android glsurfaceview android-layout

5
推荐指数
0
解决办法
2607
查看次数

如何从MediaCodec的解码输出中获取YUV并绘制在GLSurfaceView上?

我需要使用 GLSurfaceView 播放视频流。我试图获取输出并渲染它们。但是颜色不对。

我将输出缓冲区转储到文件并用 yuv 查看器打开它,颜色也不正确。所以我怀疑我使用错误的方式来获取输出缓冲区?这是代码:

mediaCodec = MediaCodec.createDecoderByType("video/avc");
MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, 500000);
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 15);
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420PackedSemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 5);
mediaCodec.configure(mediaFormat, null, null, 0);
mediaCodec.start();

ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();

int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
   ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
   inputBuffer.clear();
   inputBuffer.put(avFrame.frmData);
   mediaCodec.queueInputBuffer(inputBufferIndex, 0, avFrame.frmData.length, 0L, 0);
  }

MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo, 0);
byte[] outData = new byte[bufferInfo.size];
while (outputBufferIndex >= 0) {
    ByteBuffer outputBuffer = …
Run Code Online (Sandbox Code Playgroud)

android yuv glsurfaceview android-mediacodec

5
推荐指数
0
解决办法
2101
查看次数

Android WebRTC自定义远程和本地视图

我正在Android项目中实现webrtc,我基于github中的这个示例.

此示例使用libjingle库.这是创建视频渲染视图的方式:

        // Create video renderers.
        VideoRendererGui.setView((GLSurfaceView)videoView, new Runnable() {
            @Override
            public void run() {
                createPeerConnectionFactory();
            }
        });
        remoteRender = VideoRendererGui.create(
                REMOTE_X, REMOTE_Y,
                REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, false);
        localRender = VideoRendererGui.create(
                LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING,
                LOCAL_WIDTH_CONNECTING, LOCAL_HEIGHT_CONNECTING, scalingType, true);
Run Code Online (Sandbox Code Playgroud)

我的问题是我如何设法自定义remoteRenderlocalRender,以便我可以positionGLSurfaceView它的宽度和高度更改它

编辑:

我做了一个听众,我试过这个:

    @Override
    public void onWidthHeightChange(int width, int height) {
        VideoRendererGui.update(remoteRender,
                REMOTE_X-width, REMOTE_X-height,
                REMOTE_WIDTH-width, REMOTE_HEIGHT-height, scalingType, false);
        if (iceConnected) {
            VideoRendererGui.update(localRender,
                    LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
                    LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
                    ScalingType.SCALE_ASPECT_FIT, true);
        } else {
            VideoRendererGui.update(localRender,
                    LOCAL_X_CONNECTING, LOCAL_Y_CONNECTING, …
Run Code Online (Sandbox Code Playgroud)

android video-streaming libjingle glsurfaceview webrtc

5
推荐指数
1
解决办法
3171
查看次数

如何在Camera View android中的墙壁上绘画?

我正在尝试在我的相机视图中粉刷墙壁。任何人都可以告诉我应该从哪里开始,任何图书馆或可以为我指明正确方向的有用东西。

我知道这是一件困难的事情,但我需要一些方向来继续我的工作。目前我只尝试过VuForia,但我不知道我们如何使用它来识别墙壁并在增强现实的墙壁上绘画。

下面是所需的结果:

在此处输入图片说明

在此处输入图片说明

android surfaceview glsurfaceview android-camera vuforia

5
推荐指数
1
解决办法
1754
查看次数

如何使用近处和远处位置识别3D对象内部或外部3D对象的单击

我正在使用带有Android,Java代码的OpenGLES 2.0进行3D对象渲染.如何使用以下代码在近处和远处位置识别3D对象内部或外部3D对象?

public static PointF screenToWorld(float[] viewMatrix,
                                       float[] projMatrix, float screenX, float screenY) {
        float[] nearPos = unProject(viewMatrix, projMatrix, screenX, screenY, 0);
        float[] farPos = unProject(viewMatrix, projMatrix, screenX, screenY, 1);

        Log.d(LOGTAG,"nearPos ->"+nearPos.length+" "+nearPos);
        Log.d(LOGTAG,"farPos ->"+farPos.length+" "+farPos);

        // The click occurred in somewhere on the line between the two points
        // nearPos and farPos. We want to find
        // where that line intersects the plane at z=0
        float distance = nearPos[2] / (nearPos[2] - farPos[2]); // Distance between nearPos and z=0 …
Run Code Online (Sandbox Code Playgroud)

android opengl-es glsurfaceview opengl-es-2.0 raycasting

5
推荐指数
1
解决办法
174
查看次数