1

私は次のアーキテクチャで作業しています:

  • iOS 上の OpenGL ES 2
  • 同じ ShareGroup を持つ 2 つの EAGL コンテキスト
  • 2 つのスレッド (サーバー、クライアント = メインスレッド); サーバーは素材をテクスチャにレンダリングし、クライアントは単純なテクスチャ付きクワッドを使用してテクスチャを表示します。

サーバースレッドへの追加の詳細 (作業コード)

初期化中に fbo が作成されます。

void init(void) {
    glGenFramebuffer(1, &fbo);
}

サーバーのレンダリング ループは、おおよそ次のようになります。

GLuint loop(void) {
    glBindFrameBuffer(GL_FRAMEBUFFER, fbo);
    glViewport(0,0,width,height);

    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);

    // Framebuffer completeness check omitted

    glClear(GL_COLOR_BUFFER_BIT);

    // actual drawing code omitted

    // the drawing code bound other textures, so..
    glBindTexture(GL_TEXTURE_2D, tex);
    glGenerateMipmap(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, GL_NONE);
    glFlush();

    return tex;
}

これまでのところ、これはすべて正常に機能します。

新しい (バグのある) コード

ここで、GL_APPLE_framebuffer_multisample 拡張機能を使用してサーバー スレッドにマルチサンプリングを追加し、初期化コードを次のように変更します。

void init(void) {
    glGenFramebuffer(1, &resolve_fbo);
    glGenFramebuffers(1, &sample_fbo);
    glBindFramebuffer(GL_FRAMEBUFFER, sample_fbo);
    glGenRenderbuffers(1, &sample_colorRenderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, sample_colorRenderbuffer);
    glRenderbufferStorageMultisampleAPPLE(GL_RENDERBUFFER, 4, GL_RGBA8_OES, width, height);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, sample_colorRenderbuffer);

    // Framebuffer completeness check (sample_fbo) omitted

    glBindRenderbuffer(GL_RENDERBUFFER, GL_NONE);
    glBindFramebuffer(GL_FRAMEBUFFER, GL_NONE);
}

メイン ループは次のように変更されました。

GLuint loop(void) {
    glBindFrameBuffer(GL_FRAMEBUFFER, sample_fbo);
    glViewport(0,0,width,height);

    GLuint tex;
    glGenTextures(1, &tex);
    glBindTexture(GL_TEXTURE_2D, tex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

    glClear(GL_COLOR_BUFFER_BIT);

    // actual drawing code omitted

    glBindFramebuffer(GL_FRAMEBUFFER, resolve_fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);

    // Framebuffer completeness check (resolve_fbo) omitted

    // resolve multisampling
    glBindFramebuffer(GL_DRAW_FRAMEBUFFER_APPLE, resolve_fbo);
    glBindFramebuffer(GL_READ_FRAMEBUFFER_APPLE, sample_fbo);
    glResolveMultisampleFramebufferAPPLE();

    // the drawing code bound other textures, so..
    glBindTexture(GL_TEXTURE_2D, tex);
    glGenerateMipmap(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, GL_NONE);
    glFlush();

    return tex;
}

私が今見ているのは、テクスチャには複数の loop() 呼び出しからのデータが含まれており、一緒にブレンドされているということです。ある種の「アンバインド」か、おそらくglFinish()呼び出しが欠落していると思います(以前は別の時点でこのような問題がありました。テクスチャデータを設定してすぐに使用しました-テクスチャを強制するglTexImage2D()ための呼び出しが必要でしたglFinish()更新予定)。

ただしglFinish()、描画コードの後に​​ a を挿入しても、ここでは何も変更されませんでした..

4

1 に答える 1

1

ああ、気にしないで、そのようなばかげた間違い。loop() メソッドが実際に for ループを含み、複数のテクスチャをレンダリングするという詳細は省略しました。間違いは、このループの前にのみサンプル fbo をバインドしたため、最初の実行後に解決 fbo がバインドされていたことです。

ループ内で fbo バインディングを移動すると、問題が修正されました。

とにかく、すべての読者に感謝し、時間を無駄にして申し訳ありません:)

于 2012-06-01T12:04:49.187 に答える