2011-06-24 18 views
2

にロードする画像を、私は次のスニペットで、複数のFBOsに(8×8 * .BMP画像から)複数のテクスチャをロードしようとしている:のOpenGL:テクスチャ配列

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()は、エラーが「無効な値」というエラーを示す次の行にあることを示します。 - B、XOFFSET +幅> W - B、YOFFSET < - B < XOFFSET場合

GL_INVALID_VALUEが生成されます。

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

manualを読んだ後、私は、エラーは、次のステートメントに関連付けられていると思います、またはyoffset + height> h-b、またはzoffset <-b、またはzoffset + depth> d-b、wはGL_TEXTURE_WIDTH、hはGL_TEXTURE_HEIGHT、dはGL_TEXTURE_DEPTH、bはテクスチャ画像の境界幅変更されています。 w、h、およびdには境界幅の2倍が含まれていることに注意してください。

これらのテクスチャをどのように動作させるかについてのヒントはありませんでした。何か案は?前もって感謝します。

答えて

4

新しいイメージをテクスチャにレンダリングする場合にのみ、FBOにテクスチャをアタッチすることは意味があります。しかし、すでにイメージファイルをイメージファイルに格納しているので、FBOにテクスチャを添付する必要はありません(FBOに犠牲になる予定のイメージを読み込む際にメモリとCPUサイクルを浪費しない限り)。

FBOの誤用を取り除いて、うまくいくはずです。

はたぶん、あなたは事の異なる種類であり、実際にはテクスチャ生成を加速したい場合に使用する意味を成しているPBO類(ピクセルバッファオブジェクト)、とFBOs(フレームバッファオブジェクト)を混同しました。あなたが実際に必要なもの

をコメントすることにより、

EDITは私がパフォーマンスにに関する問題を参照してくださいと思う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); 
} 
+0

です。ありがとう!とにかく、画像をロードする方法はありますか? – snowball147

+0

@ snowball147:FBOは必要ありません。glTexImage3Dで画像をロードして終了してください。 – datenwolf

+0

@ snowball147:私の答えは固定コードの編集を参照してください。 – datenwolf

関連する問題