为什么 glGenTextures returns 在 OpenGL 上下文线程 (Android) 上为零?

Why does glGenTextures returns zero on OpenGL context Thread (Android)?

我遇到一个问题,其中 GLES20.glGenTextures() 为纹理名称返回零,即使 运行 在原始线程(即 OpenGL 上下文线程)上也是如此。

当我运行代码

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 returns (A) 的有效名称和 (B) 的零。

为什么会这样?

这类似于 glGenTextures returns zero in background thread ,但在这种情况下,代码实际上 运行ning 在 OpenGL 上下文线程上。

我明白了。事实证明 "original thread" 与我的 activity 的主循环程序不同。

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

我发现它也 returns 0 如果是:

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

eglMakeCurrent:992 error 3009 (EGL_BAD_MATCH)

到日志