3

すべてのテクスチャをプリロードするために、Android NDK ゲーム プロジェクトの読み込み画面を作成しようとしています。他のスレッドでテクスチャを作成すると、テクスチャ幅のような値が正しく設定されますが、glGetError が 0 を返す場合でも、テクスチャの代わりに黒いスプライトが取得されます。同じスレッドではすべて正常に動作するため、スプライトまたはテクスチャ コードにエラーはないと仮定します.

これは、EGL によって提供されるコンテキストなしで、別のスレッドから opengl es 2.0 関数を呼び出そうとしているためだと思います。しかし、Java (Android) で作成された EGL から opengl es 2.0 コンテキストを取得し、それをバインドしてネイティブ 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*/
4

2 に答える 2

2

別のスレッドからOpenGLES関数を呼び出すには、2つのスレッド間で共有OpenGLESコンテキストを作成する必要があります。

より簡単な解決策があります。OpenGLESコンテキストを所有するスレッドにイベントを送信して、2番目のスレッドに読み込まれるとすぐにテクスチャを更新します。

于 2012-07-26T18:22:44.057 に答える
-1

Android は共有 OpenGL コンテキストをサポートしていないため、メイン コンテキストを使用してテクスチャを作成する必要があります。バックグラウンド スレッドでテクスチャ データをロードできますが、そのデータを使用したテクスチャの作成はメイン コンテキストで行う必要があります。テクスチャ データをロードした後にイベントをメイン スレッドに送信するという Sergey の提案は、Android での正しいアプローチです。

于 2012-08-01T12:23:37.650 に答える