2015-03-30 244 views
0

我遇到了一个问题,即GLES20.glGenTextures()对于纹理名称返回零,即使在原始线程(这是OpenGL上下文线程)上运行时也是如此。为什么glGenTextures在OpenGL上下文线程(Android)上返回零?

当我运行代码

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 returns zero in background thread类似,但在这种情况下,代码实际上是在OpenGL上下文线程上运行的。

回答

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 
1

我发现它也返回0,如果两种:

1)你叫eglMakeCurrent()之前调用它 2)你有与错配表面属性,然后eglMakeCurrent似乎已经工作,但实际上写入

eglMakeCurrent: 992错误3009(EGL_BAD_MATCH)

到日志

相关问题