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

OpenGL:将图像加载到纹理数组中,opengl,textures,fbo,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_

我正试图通过以下代码片段将多个纹理(从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);
}
阅读后,我认为错误与以下语句有关:

如果xoffset<-b,xoffset+width>w-b,yoffset<-b,或yoffset+height>h-b,或zoffset<-b,或zoffset+depth>d-b,则生成GL\u无效值,其中w是GL\u纹理的宽度,h是GL\u纹理的高度,d是GL\u纹理的深度,b是正在修改的纹理图像的边界宽度。请注意,w、h和d包括两倍的边框宽度


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

仅当您要将新图像渲染到纹理中时,将纹理附加到FBO才有意义。但是,您已经拥有图像文件形式的图像,因此绝对没有理由将纹理附加到FBO(除非您希望在加载将“牺牲到FBO”的图像时浪费内存和CPU周期)

摆脱对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);
}
GLuint;
glGenTextures(1,&textureID);
glBindTexture(GL_TEXTURE_3D,textureID);
GLTEXAGE3D(GL_纹理_2D_数组_文本,0,GL_RGB8I_文本,纹理_宽度,纹理_高度,纹理_数量,0,GL_RGB,GL_无符号字节,NULL);
检查错误(“开始检查”);
对于(int i=0;i
我想我看到了性能方面的问题。谢谢无论如何,有没有办法加载图像?@snowball147:您不需要FBO,只需使用glTexImage3D加载图像,然后使用它即可。@snowball47:您的系统实际上支持2D纹理阵列吗?您必须通过测试OpenGL版本是否至少为3.0(强制使用纹理数组)或
glGetString(glu扩展)返回的字符串来测试这一点包含
GL\u EXT\u texture\u数组
。如果没有,那么您就不能使用该系统。
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);
}