OpenGL: загрузка изображений в массив текстур - PullRequest
2 голосов
/ 24 июня 2011

Я пытаюсь загрузить несколько текстур (из 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);

После прочтения руководства , я думаю, что ошибка связана со следующейоператор:

GL_INVALID_VALUE генерируется, если xoffset <- b, xoffset + width> w - b, yoffset <- b, или yoffset + height> h - b, или zoffset <- b, или zoffset+ глубина> d - b, где w - GL_TEXTURE_WIDTH, h - GL_TEXTURE_HEIGHT, d - GL_TEXTURE_DEPTH, а b - ширина границы изменяемого изображения текстуры.Обратите внимание, что w, h и d включают вдвое большую ширину границы.

Что не дало мне понять, как заставить работать эти текстуры.Есть идеи?Заранее спасибо.

1 Ответ

4 голосов
/ 24 июня 2011

Присоединение текстур к FBO имеет смысл, только если вы хотите отобразить новое изображение в текстуре. Однако у вас уже есть изображения в форме файлов изображений, поэтому нет абсолютно никакой причины прикреплять текстуры к FBO (если только вы не хотите тратить впустую память и циклы ЦП на загрузку изображений, которые будут «принесены в жертву FBO»).

Избавьтесь от неправильного использования FBO, и все будет в порядке.

Может быть, вы перепутали FBO ( Frame Buffer Objects) с PBO ( Pixel Buffer Objects), которые представляют собой разные вещи и действительно имеют смысл использовать, если вы хочу ускорить генерацию текстур.

РЕДАКТИРОВАТЬ согласно комментарию

На самом деле вам нужен текстурный объект

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...