2

次のスニペットで、複数のテクスチャ (8x8 *.bmp 画像から) を複数の FBO にロードしようとしています。

glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_RGB8I_EXT, TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_NUM, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

for( int i = 0; i < TEXTURE_NUM; i++ )
{
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, RBO_ID[i]);
    glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
    glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO_ID[i]);
    glFramebufferTextureLayerEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, TexArray_ID, 0, i);
    glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, RBO_ID[i]);
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}

checkGLErrors("begin check");
for ( int i = 0; i < TEXTURE_NUM; i++ )
{
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FBO_ID[i]);
    char fileName[32];
    sprintf(fileName, "./img/%02d.bmp", i);
    unsigned char* imgData;
    imgData = loadBMP(fileName);
    if (imgData)
        printf("imgData %s is successfully loaded\n",fileName);
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, imgData);
    checkGLErrors("end check");
    free(imgData);      
    glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, NULL);
}

ただし、 glTexSubImage3D 関数を使用してこれらのテクスチャを添付することはできません。CheckGLErrors() は、エラーが次の行にあることを示し、「無効な値」エラーを示しています。

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, imgData);

マニュアルを読んだ後、エラーは次のステートメントに関連していると思います。

w がGL_TEXTURE_WIDTH、h は GL_TEXTURE_HEIGHT、d は GL_TEXTURE_DEPTH、b は変更されるテクスチャ イメージの境界幅です。w、h、および d には、ボーダー幅の 2 倍が含まれることに注意してください。

そのため、これらのテクスチャを機能させる方法についての手がかりがありませんでした。何か案は?前もって感謝します。

4

1 に答える 1

4

テクスチャを FBO にアタッチすることは、新しい画像をテクスチャにレンダリングする場合にのみ意味があります。ただし、既に画像ファイルの形式で画像があるため、テクスチャを FBO にアタッチする理由はまったくありません (「FBO に犠牲にされる」画像をロードする際にメモリと CPU サイクルを浪費したくない場合を除きます)。

FBO の誤用をなくせば、大丈夫です。

FBO (フレームバッファ オブジェクト) と PBO (ピクセルバッファ オブジェクト) を混同しているかもしれませんが、これらは別の種類のものであり、テクスチャ生成を高速化したい場合に実際に使用する意味があります。

コメントによる編集

実際に必要なのは Texture オブジェクトです

GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_3D, textureID);

glTexImage3D(GL_TEXTURE_2D_ARRAY_EXT, 0, GL_RGB8I_EXT, TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_NUM, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);

checkGLErrors("begin check");
for ( int i = 0; i < TEXTURE_NUM; i++ )
{
    char fileName[32];
    sprintf(fileName, "./img/%02d.bmp", i);
    unsigned char* imgData;
    imgData = loadBMP(fileName);
    if (imgData)
        printf("imgData %s is successfully loaded\n",fileName);
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, i, 8, 8, 1, GL_RGB, GL_UNSIGNED_BYTE, imgData);
    checkGLErrors("end check");
    free(imgData);
}
于 2011-06-24T08:09:23.697 に答える