标签: glsurfaceview

添加GLSurfaceView时单个黑色闪烁

我在CompoundView中使用GLSurfaceView来实现精美的导航.目前,GLSurfaceView是在选择子部分时创建的,而不是在开始时创建的.

我的问题是,当第一次创建GLSurfaceView时,屏幕会瞬间闪烁.选择不同的子部分时,它不会闪烁; 在这种情况下,当前的GLSurfaceView被丢弃,另一个被创建.

当然,这非常令人恼火,特别是因为它在非常轻的主题上闪烁着黑色.我想在大多数情况下它都没关系,因为GLSurfaceViews通常是全屏的并且使用寿命很长,但在这种情况下它是一个传统的Android应用程序,它可以一直打开和关闭活动.

有没有办法规避这个?就像在创建活动时预先初始化OpenGl一样(我假设闪烁在那里不会那么烦人)?

android opengl-es glsurfaceview

7
推荐指数
0
解决办法
495
查看次数

GLSurfaceView在Android 4.2的Nexus 7上显示黑色

我有一个OpenGL ES2.0应用程序正在运行各种Android版本从2.2到4.1的设备.但是有人告诉我,当在Android 4.2的Nexus 7上运行时,应用程序中的3D图形都是黑色的.操作栏和对话框工作正常.我已经尝试在带有Intel Atom处理器的仿真Nexus 7上运行HAX和GPU,运行4.2.2并且运行正常.我本来希望运行ARM映像,但似乎不包括Open GL ES2.0

有没有人能够深入了解Nexus 7上可能导致此问题的原因以及如何解决这个问题?

一种可能性是当前App版本的目标API级别设置为15,而4.2.2是级别17.这可能是一个问题吗?它虽然在模拟器上运行正常.

下面是我用来在渲染器onSurfaceCreated()中设置纹理的代码,以防任何帮助.

/**
 * Sets up texturing for the object
 */
private void setupTextures(String[] texFiles) {
    // create new texture ids if object has them
    // number of textures
    mTextureIDs = new int[texFiles.length];

    GLES20.glGenTextures(texFiles.length, mTextureIDs, 0);

    for(int i = 0; i < texFiles.length; i++) {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]);

        // parameters
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_NEAREST);
        GLES20.glTexParameterf(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_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                GLES20.GL_REPEAT);

        int ID = mContext.getResources().getIdentifier( texFiles[i], "raw", "com.antonymsoft.slidixcube" );
        InputStream …
Run Code Online (Sandbox Code Playgroud)

android glsurfaceview opengl-es-2.0 android-4.2-jelly-bean

6
推荐指数
1
解决办法
2049
查看次数

IllegalArgumentException Surface.nativeLockCanvas,Choreographer,BufferQueue

我有一个复杂的应用程序,它创建多个Bitmap对象并使用它们来创建BitmapDrawables.我知道这可能是一个难以回答的问题,但任何指导我指向正确方向的帮助都会非常感激.我已经对内存分配进行了测试,并且主要是空手而归....关于可能导致这种情况的任何想法?

日志:

04-29 12:48:00.442: E/BufferQueue(177): [com.example.app/com.example.app.Activity_One] queueBuffer: fence is NULL
04-29 12:48:00.442: E/Surface(2154): queueBuffer: error queuing buffer to SurfaceTexture, -22
04-29 12:48:00.442: W/Adreno-EGLSUB(2154): <SwapBuffers:1374>: failed to queueBuffer
04-29 12:48:00.442: W/Adreno-EGL(2154): <qeglDrvAPI_eglSwapBuffers:3654>: EGL_BAD_SURFACE
04-29 12:48:04.486: W/Adreno-EGLSUB(2154): <DequeueBuffer:606>: dequeue native buffer fail: Unknown error 2147483646, buffer=0x0, handle=0x0
04-29 12:48:04.486: E/BufferQueue(177): [com.example.app/com.example.app.Activity_One] dequeueBuffer: can't dequeue multiple buffers without setting the buffer count
04-29 12:48:04.486: W/Adreno-EGLSUB(2154): <DequeueBuffer:606>: dequeue native buffer fail: Invalid argument, buffer=0x0, handle=0x0
04-29 12:48:04.486: W/Adreno-ES20(2154): <gl2_surface_swap:43>: GL_OUT_OF_MEMORY
04-29 12:48:04.486: W/Adreno-EGL(2154): <qeglDrvAPI_eglSwapBuffers:3597>: …
Run Code Online (Sandbox Code Playgroud)

java android illegalargumentexception glsurfaceview

6
推荐指数
1
解决办法
6654
查看次数

为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?

我正在开发一款在相机视图上执行OpenCL/OpenGL互操作的Android应用.我正在使用GLSurfaceView.Renderer.当然,从onSurfaceCreated调用创建和初始化OpenCL运行环境(来自OpenGL)的代码,并且每个预览框架的实际处理都在onDrawFrame中进行.

一切顺利,除非我完成,我想清理OpenCL的东西.理想情况下,onSurfaceDestroyed方法是清理的最佳位置,但GLSurfaceView.Renderer中没有这样的方法.所以清理代码无处可去,我的应用程序可能存在内存泄漏.

这是我的问题:

  1. 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?有onSurfaceCreated和onSurfaceChanged.人们会期望onSurfaceDestroyed在那里.

  2. 鉴于GLSurfaceView.Renderer中不存在onSurfaceDestroyed,我的清理代码应该去哪里,为什么?

android opengl-es opencl glsurfaceview

6
推荐指数
1
解决办法
1769
查看次数

setPreviewTexture在MTK设备中失败

最近我正在通过grafika(感谢fadden)学习安卓摄像头和OpenglES.它在大多数设备上都很好,但我遇到了一些设备中的错误,特别是MTK设备(如MT6580,MT8163 ......).

例如,当"CameraCaptureActivity"在MTK中运行时.我收到此错误:

java.lang.NullPointerException:尝试在空对象引用上调用虚方法'void android.hardware.Camera.setPreviewTexture(android.graphics.SurfaceTexture)'

所以我将"handleSetSurfaceTexture"函数更改为:

 private void handleSetSurfaceTexture(SurfaceTexture st) {
    if(mCamera == null)
    {
        Log.e(TAG, "mCamera return null");
        return;
    }
    st.setOnFrameAvailableListener(this);
    try {
        mCamera.setPreviewTexture(st);

    } catch (Exception ioe) {
        Log.e(TAG, "camera failed handleSetSurfaceTexture");
        throw new RuntimeException(ioe);
    }
    mCamera.startPreview();
}
Run Code Online (Sandbox Code Playgroud)

然后错误更改为:

java.lang.RuntimeException:java.io.IOException:setPreviewTexture在jp.co.cyberagent.android.gpuimage.grafika.CameraCaptureActivity.handleSetSurfaceTexture(CameraCaptureActivity.java:1150)失败

我读了许多其他相机应用程序源代码,我想可能在MTK设备中有Camera和SurfaceRender的同步问题.所以我改变了这样的代码:

private void waitUntilSetup()
{
    long l = System.currentTimeMillis();
    while ((getMaxTextureSize() == 0) && (System.currentTimeMillis() - l < 3000L))
    {
        SystemClock.sleep(100L);
    }

    Log.e(TAG,"getMaxTextureSize() = " + getMaxTextureSize());
}

private int getMaxTextureSize() {
    int[] maxTextureSize = new int[1];
    GLES20.glGetIntegerv(GL10.GL_MAX_TEXTURE_SIZE, …
Run Code Online (Sandbox Code Playgroud)

android glsurfaceview android-camera grafika

6
推荐指数
1
解决办法
3199
查看次数

如何从GLSurfaceView保存位图(只有位图,而不是整个纹理)

我正在使用此代码对GlSurfaceView上的位图赋予多重效果. 应用效果,图像上,使用效果

现在,我想保存位图.他们给出了保存位图的代码,但是,整个GlSurfaceView将被保存为位图图像.相反,我想只保存位图区域以保存为图像.

有一种方法可以获取像素并从中制作位图并制作图像.例如:

  public Bitmap takeScreenshot(GL10 mGL) {
  final int mWidth = mEffectView.getWidth();
  final int mHeight = mEffectView.getHeight();
  IntBuffer ib = IntBuffer.allocate(mWidth * mHeight);
  IntBuffer ibt = IntBuffer.allocate(mWidth * mHeight);


  mGL.glReadPixels(0, 0, mWidth, mHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);

   // Convert upside down mirror-reversed image to right-side up normal
  // image.
  for (int i = 0; i < mHeight; i++) {
   for (int j = 0; j < mWidth; j++) {
    ibt.put((mHeight - i - 1) * mWidth + j, ib.get(i …
Run Code Online (Sandbox Code Playgroud)

android textures opengl-es bitmap glsurfaceview

6
推荐指数
1
解决办法
2890
查看次数

如何在包含OpenGL上下文和GL线程的情况下使用GLSurfaceView正确旋转Android设备?

我有一个简单的Android应用程序,使用我们的OpenGL渲染SDK将数据呈现给Android GLSurfaceView.由于我们提供和SDK供其他人使用,我们需要支持GLSurfaceViews的所有用例.目前,我们需要能够在重新创建所有Android视图并保持OpenGL上下文活动的同时旋转设备.这源于客户在横向和横向模式下需要不同的布局.

解决这个问题的正常方法是:

1.添加android:configChanges="orientation|screenSize"到您的活动中AndroidManifest.xml,您将没事.

这将不会在这种情况下,作为工作这不会重新上旋转的意见.因此,通过这样做,我们不能在横向和横向模式中具有不同的布局.

2.呼叫GLSurfaceView.onPause()GLSurfaceView.onResume()Activity.

虽然这被认为是一种很好的做法,但在这个用例中还不够,因为在执行此操作时会破坏OpenGL上下文.请注意,我们仍然这样做,它只是没有解决我们的问题.

3.使用a EGLContextFactory在旋转时保留OpenGL上下文.

这是可能的和有用的,例如在该答案中所描述的.感觉就像一个黑客,但它绝对有效.这个想法只是EGLContext在你没有一个时创建一个并重用你拥有的那个.

使用此hack时遇到的主要问题是渲染线程在GLSurfaceView分离并重新连接到视图层次结构时被销毁并重新创建.这似乎是通过查看GLSurfaceView实现来设计的.

在我们的SDK中,我们有一些线程本地存储连接到线程,所以突然得到一个新的渲染线程是不太可取的.我们可能会在渲染线程发生变化时更改某些状态,但我们想调查是否有更好的方法来执行此操作.

所以我的问题是:

答:使用EGLContextFactory"正确"的方式能够在旋转时手动保存OpenGL上下文吗?

B.有没有办法在旋转时不破坏和重新创建渲染线程(不修改源代码)?

C.在保持OpenGL上下文和渲染线程的同时,是否有更好/更简单的替代方法来实现视图销毁/重建的轮换?

额外信息:

  • 我们总是打电话setPreserveEGLContextOnPause(true);.
  • 渲染本身没有问题,只是所描述的相关问题是有问题的.

android opengl-es glsurfaceview android-thread

6
推荐指数
0
解决办法
859
查看次数

Android CameraX GLSurfaceView

拜托,有人可以提供在 GLSurfaceView 中使用 CameraX 库的好例子,找不到任何信息。

android glsurfaceview android-camerax

6
推荐指数
1
解决办法
825
查看次数

如何制作圆形蒙版和剪辑 GLSurfaceView?

我使用GLSurfaceView通过回调提供矩形的 SDK 。

我希望能够以圆形布局呈现此视图。(即)我想在圆形视图上显示视图

  • 它显示,当我覆盖圆形GLSurfaceViewImageView

GLSurfaceView 超过 ImageView

  • 它呈现方形,当我覆盖GLSurfaceViewVideoView

GLSurfaceView 超过 VideoView

我试过下面的代码来制作圆圈 GLSurfaceView

public class SampleGLView extends GLSurfaceView implements View.OnTouchListener {

    private Path clippingPath;

    public SampleGLView(Context context) {
        this(context, null);
    }

    public SampleGLView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnTouchListener(this);
    }

    private TouchListener touchListener;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        final int actionMasked = event.getActionMasked();
        if (actionMasked != MotionEvent.ACTION_DOWN) {
            return false;
        }

        if (touchListener != null) { …
Run Code Online (Sandbox Code Playgroud)

android surfaceview glsurfaceview

6
推荐指数
0
解决办法
166
查看次数

GLSurfaceView 之上的 Android 视图同步

有没有一种好方法可以View在a之上绘制标准Android对象GLSurfaceView并同步两层之间的移动?

\n

我的布局看起来像

\n
<FrameLayout>\n     <RelativeLayout>\n     <MyCustomGLSurfaceView>\n</FrameLayout>\n
Run Code Online (Sandbox Code Playgroud)\n

MyCustomGLSurfaceView实现了一个摄像头,当用户适当地触摸屏幕时,该摄像头就会移动。

\n

在渲染器中的回调结束时,onDrawFrame()我调用回调来告诉RelativeLayout相机已移动,并且它应该根据需要更新任何子视图的位置。

\n

为了尝试同步两个层,我正在执行以下操作:

\n
    \n
  • 设定renderMode = RENDERMODE_WHEN_DIRTY范围内MyCustomGLSurfaceView
  • \n
  • MyCustomGLSurfaceView实现Choreographer.FrameCallback并在doFrame(frameTimeNanos: Long)方法调用中requestRender()
  • \n
  • onDrawFrame 调用回调来指示相机已移动,并RelativeLayout根据需要更新 it\xe2\x80\x99s 子视图的位置。
  • \n
  • 将相机的位置延迟 1 帧,因为MyCustomGLSurfaceView看起来 AndroidView对象直到下一帧才在屏幕上更新,而 则MyCustomGLSurfaceView立即更新。
  • \n
\n

其理论是,通过侦听Choreographer回调,渲染MyCustomGLSurfaceView会在应用程序重新绘制标准 UI 元素的同时进行。

\n

这似乎工作得相当好,但 Android 对象层中存在明显的卡顿View。另外,通过设置边距来定位 Android 层中的元素View会出现一些奇怪的行为(视图在离开屏幕时会被破坏,并且并不总是重新出现,有时甚至根本停止更新)。我尝试使用它们来定位它们translationX …

android opengl-es surfaceview glsurfaceview textureview

6
推荐指数
0
解决办法
217
查看次数