OpenGL, как я могу прикрепить буфер глубины к кадровому буферу, используя мультидискретную 2d текстуру

Как я могу прикрепить буфер глубины к моему объекту кадрового буфера, когда я использую 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, &gts);
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);

Меня все еще интересует, что было не так с оригинальной реализацией, поэтому вопрос все еще стоит.

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]