Как я могу прикрепить буфер глубины к моему объекту кадрового буфера, когда я использую GL_TEXTURE_2D_MULTISAMPLE. glCheckFramebufferStatus(msaa_fbo)
из приведенного ниже кода возвращает 0. Из документации это, по-видимому, означает, что msaa_fba не является кадровым буфером, а создан из glGenFramebuffers(1, &msaa_fbo);
,
Кроме того, если возникает ошибка, возвращается ноль.
GL_INVALID_ENUM генерируется, если целью не является GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER или GL_FRAMEBUFFER.
Ошибка 1280, что, я думаю, означает GL_INVALID_ENUM.
Если я удаляю вложение буфера глубины, программа запускается и рендерится (хотя без проверки глубины). Ошибка все еще присутствует, когда она запускается тогда. С включенным вложением глубины возникает ошибка (1286) после каждого кадра, которая является INVALID_FRAMEBUFFER. Я не знаю, как продолжить отсюда. Некоторые примеры, на которые я смотрел, делают то же самое, но, похоже, работают.
glGenTextures(1, &render_target_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_target_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);
glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_target_texture, 0);
glGenRenderbuffers(1, &depth_render_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_render_buffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, NUM_SAMPLES, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_render_buffer);
GLenum status = glCheckFramebufferStatus(msaa_fbo);
Большая часть кода от этот.
РЕДАКТИРОВАТЬ
Проверка состояния была неправильной, это должно было быть GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
, Теперь нет ошибки, когда я не включаю глубину. Когда я включаю глубину, я получаю эту ошибку сейчас: GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
,
РЕДАКТИРОВАТЬ 2
В документации утверждается, что это происходит, когда GL_TEXTURE_SAMPLES и GL_RENDERBUFFER: SAMPLES не совпадают.
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE возвращается, если значение GL_RENDERBUFFER_SAMPLES не одинаково для всех подключенных буферов рендеринга; если значение GL_TEXTURE_SAMPLES не одинаково для всех прикрепленных текстур; или, если прикрепленные изображения представляют собой смесь буферов рендеринга и текстур, значение GL_RENDERBUFFER_SAMPLES не соответствует значению GL_TEXTURE_SAMPLES.
Но они делают!
Я проверил их так:
std::cout << "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" << std::endl;
GLsizei gts, grs;
glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, >s);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &grs);
std::cout << "GL_TEXTURE_SAMPLES: " << gts << std::endl;
std::cout << "GL_RENDERBUFFER_SAMPLES: " << grs << std::endl;
Выход:
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
GL_TEXTURE_SAMPLES: 8
GL_RENDERBUFFER_SAMPLES: 8
РЕДАКТИРОВАТЬ 3
Обходили это, используя две текстуры вместо текстуры и рендер-буфера, как это:
glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);
glGenTextures(1, &render_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_texture, 0);
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_DEPTH_COMPONENT, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth_texture, 0);
Меня все еще интересует, что было не так с оригинальной реализацией, поэтому вопрос все еще стоит.
Вам необходимо использовать фиксированные выборочные местоположения для текстуры, если вы смешиваете ее с рендерингом буферов. Из спецификации в разделе «Полнота фреймбуфера»:
Значение TEXTURE_FIXED_SAMPLE_LOCATIONS одинаково для всех прикрепленных текстур; и, если прикрепленные изображения представляют собой смесь буферов рендеринга и текстур, значение TEXTURE_FIXED_SAMPLE_LOCATIONS должно быть TRUE для всех прикрепленных текстур.
{} FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
Чтобы избежать этого состояния ошибки, вызов для настройки хранилища текстур необходимо изменить на:
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE,
NUM_SAMPLES, GL_RGBA8, width, height, GL_TRUE);
Других решений пока нет …