我嘗試爲我的Android NDK遊戲項目編寫加載屏幕 - 預加載所有紋理。 如果在其他線程中創建紋理,我會得到類似於正確設置紋理寬度的值,但即使glGetError返回0,也只是得到黑色精靈而不是紋理值。在同一線程中,一切正常,因此假設精靈或紋理中沒有錯誤碼。Android NDK - 從其他線程加載紋理
我認爲這是因爲我嘗試從另一個線程調用opengl es 2.0函數,沒有EGL提供的上下文。但是,如何從EGL中獲得opengl ES 2.0上下文,這是使用Java(Android)創建的,並將其綁定到本地C中的opengl es 2.0函數中?
的Java(機器人)
public class OGLES2View extends GLSurfaceView
{
private static final int OGLES_VERSION = 2;
public OGLES2View(Context context)
{
super(context);
setEGLContextClientVersion(OGLES_VERSION);
setRenderer(new OGLES2Renderer());
}
private GLSurfaceView ogles2SurfaceView = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ogles2SurfaceView = new OGLES2View(this);
setContentView(ogles2SurfaceView);
}
Ç
#define TRUE 1
#define FALSE 0
typedef unsigned char bool;
typedef struct game_data
{
bool loaded;
tex* t;
}game_data;
static void* loader_thread_func(void* arg)
{
JavaVM* jvm = get_java_vm(); //get java VM to detach in the end
JNIEnv* env = get_jni_env(); //== attach current thread
game_data* to_load = (game_data*) arg;
to_load->t = malloc(sizeof(tex));
set_tex(to_load->t,"textures/bonus.png");//textures width and height set correctly
to_load->loaded = TRUE;
(*jvm)->DetachCurrentThread(jvm);
return NULL;
}
void load_game_data(game_data* res)
{
pthread_t loader_thread;
pthread_create(&loader_thread, NULL, loader_thread_func, res);
}
/*in render manager file*/
static game_data* g_d = NULL;
/*in onInit func*/
g_d = malloc(sizeof(game_data));
g_d->loaded = FALSE;
load_game_data(g_d);
/*in onDraw function*/
if(g_d->loaded)
/*draw sprite*/
自從GLES20以來,Android肯定支持共享上下文。任何使用GLSurfaceView卡住的人都必須使用共享上下文才能訪問GLES30函數(如位塊傳輸)。使用GLES30,真正的緩衝區對象可以打包,並用於異步傳輸紋理到GL線程。 – 2015-12-23 18:09:15