2

テクスチャをフレームバッファにアタッチしようとすると、glCheckFramebufferStatus が特定のテクスチャ サイズに対して GL_FRAMEBUFFER_UNSUPPORTED を報告します。第 2 世代と第 4 世代の iPod Touch でテストしました。失敗するテクスチャのサイズは、2 つのモデル間で同じではありません。

いくつかの興味深い結果を次に示します。

第 2 世代 - 8x8 は失敗し、16x8 は失敗しましたが、8x16 は成功しました!

第 4 世代 - 8x8 は成功し、8x16 は成功しましたが、16x8 は失敗しました!

さまざまなサイズのテクスチャの取り付けをテストするために使用したコードを次に示します。

void TestFBOTextureSize(int width, int height)
{
    GLuint framebuffer, texture;

    // Create framebuffer
    glGenFramebuffersOES(1, &framebuffer);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, framebuffer);

    // Create texture
    glGenTextures(1,&texture);
    glBindTexture(GL_TEXTURE_2D,texture);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
    glBindTexture(GL_TEXTURE_2D,0);

    // Attach texture to framebuffer
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, texture, 0);
    GLenum error = glGetError();
    GLenum status = glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES);
    if (status==GL_FRAMEBUFFER_COMPLETE_OES)
        NSLog(@"%dx%d Succeeded!",width,height,status);
    else
        NSLog(@"%dx%d Failed: %x %x %d %d",width,height,status,error,texture,framebuffer);

    // Cleanup
    glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, 0, 0);
    glDeleteTextures(1, &texture);
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);
    glDeleteFramebuffersOES(1, &framebuffer);   
}

void TestFBOTextureSizes()
{
    int width,height;
    for (width=1; width<=1024; width<<=1)
    {
        for (height=1; height<=1024; height<<=1)
            TestFBOTextureSize(width,height);
    }
}

両方のサイズが 16 ピクセル以上であれば、両方のデバイスですべて問題なく動作するようです。しかし、気になるのは、フレーム バッファ オブジェクトにアタッチするためのテクスチャ サイズの要件について書かれたものを見たことがないということです。現時点での 1 つの解決策は、テクスチャ サイズを少なくとも 16 ピクセルに制限することです。どのテクスチャ サイズが許可されているかを動的に把握するために、起動時にこのテスト コードを実行することもできますが、それは少しばかげているようです。

4

1 に答える 1

1

iPod touch 4 でサイズ 480x320 (解像度スケールなしのフルスクリーン) のテクスチャにレンダリングしようとしたときに、同様の問題が発生しました。呼び出すglCheckFramebufferStatus()と、 が返されますGL_FRAMEBUFFER_UNSUPPORTED。私のコード:

glGenTextures(1, &texture);    
glBindTexture(GL_TEXTURE_2D, texture);        
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 480, 320, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glGenFramebuffers(1, &frameBuffer);
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
    // report error
}

この問題を調査したところGL_TEXTURE_2D、レンダリングからテクスチャへのメカニズムで使用するには、有効な OpenGL ES オブジェクトでなければならないことがわかりました。これは、テクスチャをバインドして使用する準備ができている必要があることを意味します。エラーを修正するには、いくつかのテクスチャ パラメータを設定する必要があります。非 POT テクスチャを使用しているため、このテクスチャを使用するには(デフォルト値は) およびまたは(デフォルト値は) に設定GL_TEXTURE_WRAP_する必要があります。GL_CLAMP_TO_EDGEGL_REPEATGL_TEXTURE_MIN_FILTERGL_NEARESTGL_LINEARGL_NEAREST_MIPMAP_LINEAR

16x8 の何が問題なのかわかりませんでしたが、16x9 と 17x8 はこのパラメータが設定されていれば問題なく動作します。この情報がお役に立てば幸いです。

于 2011-07-01T09:14:45.777 に答える