OpenGL:将图像加载到纹理数组中

时间:2011-06-24 07:23:19

标签: opengl textures fbo

我正在尝试通过以下代码段将多个纹理(从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);

阅读manual后,我认为错误与以下声明有关:

  如果xoffset&lt;

生成GL_INVALID_VALUE - b,xoffset + width&gt; w - b,yoffset&lt; - b,或yoffset + height&gt; h - b或zoffset&lt; - b,或zoffset + depth&gt; d - b,其中w是GL_TEXTURE_WIDTH,h是GL_TEXTURE_HEIGHT,d是GL_TEXTURE_DEPTH,b是要修改的纹理图像的边框宽度。请注意,w,h和d包含两倍的边框宽度。

这让我不知道如何让这些纹理工作。有任何想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

如果要将新图像渲染到纹理中,仅将纹理附加到FBO才有意义。但是你已经有了图像文件形式的图像,所以绝对没有理由将纹理附加到FBO(除非你想在加载图像时浪费内存和CPU周期,而这些图像将被“牺牲给FBO”)。

摆脱对FBO的滥用,你应该没事。

也许你把FBO(框架缓冲区对象)与PBO(像素缓冲区对象)混淆了,这些是不同类型的东西,实际上有意义使用如果你想加速纹理生成。

由于评论而编辑

您实际需要的是纹理对象

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);
}