我有一个问题,即使在原始线程(这是OpenGL上下文线程)上运行,GLES20.glGenTextures()也会为纹理名称返回零。

当我运行代码

final Handler handlerForOriginalThread = new Handler(activity.getMainLooper());

final int[] textureHandleA = new int[1];
GLES20.glGenTextures(1, textureHandleA, 0);
Log.v(TAG, "textureHandle (A): " + textureHandleA[0]);

new Thread(new Runnable() 
{
    public void run() 
    {
        //[Prepare bitmap here]

        handlerForOriginalThread.post(new Runnable() 
        {
            public void run() 
            {
                final int[] textureHandle = new int[1];
                GLES20.glGenTextures(1, textureHandle, 0);
                Log.v(TAG, "textureHandle (B): " + textureHandle[0]);

                //[Load bitmap to texture here]
            }
        });
    }
}).start();

glGenTextures返回(A)的有效名称,并且(B)返回零。

为什么会这样呢?

这类似于glGenTextures在后台线程中返回零 ,但是在这种情况下,代码实际上在OpenGL上下文线程上运行。

#1楼 票数:2 已采纳

我想到了。 原来,“原始线程”与我的活动的主循环程序不同。

long origThreadID = Thread.currentThread().getId();
Log.d(TAG, "origThreadID (A): " + origThreadID);
final Handler handlerForOriginalThread = new Handler(activity.getMainLooper());

new Thread(new Runnable() 
{
    public void run() 
    {

        handlerForOriginalThread.post(new Runnable() 
        {
            public void run() 
            {
                long origThreadID = Thread.currentThread().getId();
                Log.d(TAG, "origThreadID (B): " + origThreadID);
            }
        });
    }
}).start();

结果是

origThreadID (A): 9467
origThreadID (B): 1

#2楼 票数:1

我发现如果出现以下情况,它也将返回0:

1)在调用eglMakeCurrent()之前先调用它2)您与表面属性不匹配,然后eglMakeCurrent似乎起作用了,但实际上写了一个

eglMakeCurrent:992错误3009(EGL_BAD_MATCH)

到日志

  ask by cowlinator translate from so

未解决问题?本站智能推荐:

1回复

在多个线程中使用相同的OpenGL上下文

我有一个单独的渲染线程,在该线程中,渲染器连续迭代这样的可绘制列表(Java): 然后,如果在某个时候我需要更改可绘制列表,我将启动一个新线程,该线程将执行以下操作(简化): 但这是用OpenGL Wiki写的: 为了使任何OpenGL命令都能正常工作,上下文必须是最新
1回复

我可以在 2 个 OpenGL 上下文、Android 之间共享外部纹理吗

我正在创建 2 个线程。 每个线程都有自己的 EGL 上下文。 一个线程是本机的,我将在其中渲染纹理,另一个线程在 Java 中,我想从该纹理中采样并渲染到屏幕/编码器(无关紧要)。 我不能让它工作。 我试过在任一线程上生成纹理。 我注意到的是纹理 Id 在两个线程上都是重复的(我还有其他不打算共享
1回复

在Android上的OpenGL上下文之间共享资源

我试图使用多个EGL上下文来加载我的主线程之外的纹理。 在我的eglCreateContext调用之后,我收到了一个EGL_BAD_CONTEXT错误。 在我的android.opengl.Renderer里面 EGL_BAD_CONTEXT引导我阅读这里的文档 如果s
1回复

当Android的GLSurfaceview中的opengl上下文丢失时,如何在本机堆中进行清理?

我正在为本地3d引擎做包装。 并且我使用GLSurfaceView为我的引擎建立了egl上下文。 问题是,当GLSurfaceView失去其egl上下文(onPause等)时,我真的想释放引擎使用的内存。 但是,似乎没有办法安全地进行此操作。 我试图覆盖GLSurfaceView
1回复

将GLSurfaceView上下文传递给线程

我希望将GL Renderer设置为“ DIRTY”并使用线程来控制FPS,但由于某种原因, requestRender调用似乎一起被跳过了。 我觉得这可能与线程没有获得适当的上下文有关。 有人知道将GLSurfaceView上下文传递给其他线程的好的做法吗? 这是我的主题:
1回复

当调用onPause时,openGL场景中的对象在android线程中变为空

所以这是我的第一次穿线,我正在以连续的时间间隔更新场景。 我一直在研究这个问题,并四处寻找解释,这是我头疼的最后一招。 在我的GLWorld extends GLSurfaceView类中,我在其中创建了一个处理程序: 它运行的线程是这个: 现在GLWorld对象存在于名为S
1回复

多线程android游戏上的断断续续的图像

我决定将基于sprites的2d游戏转换为android以使用opengl-es来解决一些与渲染相关的帧速率问题。 当前的设置如下: 渲染tkaes放置在其自己的线程中,rendermode设置为Continuous。 游戏逻辑更新发生在单独的威胁中。 两个线程都与同步的挂锁类进行交
2回复

在Android上的单独线程上获取GL10实例

我正在制作一个游戏,我已经创建了一个单独的线程来加载资源,3d模型等。这样UI线程在加载时就不会锁定。 但是,加载的线程需要GL10的实例才能正确加载和映射纹理。 下面是对问题的概述,以便您更好地了解我的困境: 1.我的Renderer类创建并启动“加载”线程。 2.加载线程从资