Мультисэмплирование объектов рендеринга кадров и буферов глубины

Я пытаюсь получить мультисэмплинг, работая с моим буфером кадров (для постобработки). Я могу заставить его почти работать, игнорируя буфер глубины, но у меня возникают проблемы с лицами, которые не рендерится.

Я установил свой нормальный буфер кадров, как это

glBindTexture(GL_TEXTURE_2D, m_Texture);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGB, 1280, 720, 0, GL_RGB, GL_UNSIGNED_BYTE, 0
);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture, 0
);

// Create color render buffer
glGenRenderbuffers(1, &m_TexColorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_TexColorBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, 1280, 720);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_TexColorBuffer);

// Create depth render buffer (This is optional)
glGenRenderbuffers(1, &m_RBODepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_RBODepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 1280, 720);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RBODepthBuffer);

Затем я также создаю буфер кадров мультисэмплинга, как этот.

glEnable(GL_MULTISAMPLE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_Texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_FALSE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, m_Texture, 0);

glGenRenderbuffers(1, &m_TexColorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_TexColorBuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_RGB, 1280, 720);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_TexColorBuffer);

/*  glGenRenderbuffers(1, &m_RBODepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, m_RBODepthBuffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH_COMPONENT24, 1280, 720);
glFramebufferRenderbuffer(
GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RBODepthBuffer
);*/

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_Texture, 0);

Этот код (с закомментированным разделом в буфере глубины) создает многосэмплированную текстуру, которая отображается правильно, но без глубины я получаю лица, которые не рендерится, или нормали в неправильном направлении (таким образом, под углами, которые я вижу внутри модели). Но если я раскомментирую этот раздел,

glCheckFramebufferStatus(GL_FRAMEBUFFER)

возвращается

36182

с последующим

Error 00000506 after convex fill

и в конечном итоге черный экран.

Я использую glBlitFramebuffer, чтобы скопировать мультисэмпловый fbo на односэмпловый fbo (который работает, но с проблемами, упомянутыми ранее).

Действительно застрял в этой точке и не может найти решение нигде!

0

Решение

Так что я нашел ответ благодаря некоторой устаревшей документации для случайного проекта по созданию исходного кода.

Моя ошибка была GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

С помощью этой информации я нашел, что означает ошибка, которая

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE is also returned if the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not the same for all attached textures; or, if the attached images are a mix of renderbuffers and textures, the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not GL_TRUE for all attached textures.

Таким образом, изменение GL_FALSE в конце

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_FALSE);

чтобы GL_TRUE это исправил. Так

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_TRUE);
1

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

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

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