2015-03-30 29 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)

到日誌

相關問題