Недопустимая операция glBlitFramebuffer

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

РЕДАКТИРОВАТЬ:На самом деле он всегда выдает ошибку всякий раз, когда прямоугольники для чтения и рисования имеют разный размер, поэтому я не могу использовать текстуру другого размера или того же размера, но область «рендеринга» другого размера... ?

Каждый раз, когда я перехожу к сгенерированному вручную фреймбуферу, статус проверяется через glCheckFramebufferStatusи всегда возвращает GL_FRAMEBUFFER_COMPLETE.

-САМЫЙ БОЛЬШОЙ SNIP ВСЕГДА -, см. ниже более короткий «исходный код», очевидно, пара ошибок C++ и не полная, но это только для вызовов GL

Ошибка OpenGL возникает, когда я вызываю последний метод области просмотра (Viewport ::blit )с кадровым буфером экрана в качестве цели (, передавая NULL ). Сначала он устанавливает буфер чтения своего собственного фреймбуфера (, буферы отрисовки уже были установлены ), а затем вызывает RenderTarget ::blit, который вызывает glBlitFramebuffer. В методе blit он связывает оба буфера, и вы можете видеть, что он вызывает там glCheckFramebufferStatus, который не возвращает ошибку.

Я читал это снова и снова, но не могу найти ошибку, которая ее вызывает. Когда я копирую цветовой буфер, я использую GL_LINEAR,в противном случае я использую GL_NEARESTВсе цветовые буферы используют GL_RGB32Fв качестве внутреннего формата, а буфер глубины (, который я никогда не блицирую ), используетGL_DEPTH_COMPONENT32F

РЕДАКТИРОВАТЬ, более короткий пример, просто взял все вызовы GL и заполнил параметры, которые я использовал

glBindFramebuffer(GL_READ_FRAMEBUFFER, _GL_Framebuffer);
glReadBuffer(GL_COLOR_ATTACHMENT0 + index);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);

// OpenGL error check, does not return an error

glBindFramebuffer(GL_READ_FRAMEBUFFER, _GL_Framebuffer);
GLenum status = glCheckFramebufferStatus(GL_READ_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
{
    // Some error checking, fortunately status always turns out to be complete
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

glBlitFramebuffer(0, 0, screenWidth, screenHeight, 0, 0, screenWidth, screenHeight, target, (target == GL_COLOR_BUFFER_BIT) ? GL_LINEAR : GL_NEAREST);

// If the source/destination read/draw rectangles are different in size, GL_INVALID_OPERATION is cought here

И создание фреймбуфера/текстуры:

glGenFramebuffer(1, &_GL_Framebuffer);

glGenTextures(1, &_GL_ZBuffer);
glBindTexture(GL_TEXTURE_2D, _GL_ZBuffer);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, screenWidth, screenHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);

glBindFramebuffer(GL_FRAMEBUFFER, _GL_Framebuffer);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT + 0, _GL_ZBuffer, 0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

int writeIndices[BUFFER_COUNT];
for(unsigned int i = 0; i < BUFFER_COUNT; ++i)
{
    writeIndices[i] = i;

    glGenTextures(1, &_GL_Texture);
    glBindTexture(GL_TEXTURE_2D, _GL_Texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB32F, screenWidth, screenHeight, 0, GL_RGB, GL_FLOAT, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);

    glBindFramebuffer(GL_FRAMEBUFFER, _GL_Framebuffer);
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, _GL_Texture, 0);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    // In the actual code each texture is obviously saved in an object
}

GLenum *enums = new GLenum[BUFFER_COUNT];
for(unsigned int i = 0; i < BUFFER_COUNT; ++i)
{
    // Get index and validate
    int index = *(indices + i); // indices = writeIndices
    if(index < 0 || index >= maxAttachments)
    {
        delete[] enums;
        return false;
    }

    // Set index
    enums[i] = GL_COLOR_ATTACHMENT0 + index;
}

// Set indices
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _GL_Framebuffer);
glDrawBuffers(BUFFER_COUNT, enums);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);

delete[] enums;

// OpenGL error check, no errors

6
задан Invalid 11 August 2012 в 15:39
поделиться