У меня проблемы с использованием явного мультисэмплинга при использовании нескольких целей рендеринга в OpenGL.
У меня есть 4 цели рендеринга (Position, Diffuse + opacity, Normal, Specular + exponent), которые визуализируются во время начального прохода геометрии.
Это все не мультисэмпловые текстуры, прикрепленные к объекту кадрового буфера, а затем устанавливаемые в качестве целей рендеринга с помощью glDrawBuffers (). Это отлично работает, и я могу потом попробовать эти текстуры, чтобы получить информацию, необходимую для расчетов освещения. Прекрасный.
Теперь я хочу попытаться удалить некоторые псевдонимы, которые я получаю, поэтому я начал реализовывать явный MSAA с использованием текстур с несколькими выборками. Однако, когда я использую текстуры с несколькими выборками в качестве целей рендеринга, кажется, что только первая цель рендеринга рисуется, а остальные остаются пустыми.
Кроме изменения настроек, привязки и чтения текстур в шейдерах, я не изменил никакой другой код.
Мультисэмплированные текстуры прикрепляются к объекту кадрового буфера с помощью этого кода:
for (unsigned int i = 0; i < textureCount; ++i)
{
// Generate texture
GLuint texture;
glGenTextures(1, &texture);
// Bind multisample texture
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_RGBA, width, height, false);
// Set params
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// Attach to frame buffer
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D_MULTISAMPLE, texture, 0);
// Unbind
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
}
Текстура глубины / трафарета с несколькими выборками также прилагается.
glGenTextures(1, &depth);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, msaaSamples, GL_DEPTH24_STENCIL8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth, 0);
Затем кадровый буфер связывается и устанавливается буфер рисования
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
GLuint attachments[4] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3 };
glDrawBuffers(4, attachments);
Затем я рисую геометрию как обычно. Тем не менее, при проверке с помощью apitrace становится ясно, что только первая цветовая привязка используется. Это не тот случай, когда я использую обычные (не мультисэмплированные текстуры).
Все 4 буфера дро определенно все еще установлены.
glTexParameterf нельзя использовать с GL_TEXTURE_2D_MULTISAMPLE.
Помимо этого, я бы установил для параметра ‘fixedsamplelocations’ из glTexImage2DMultisample значение true, чтобы быть в безопасности в отношении совместимости оборудования.
И я рекомендую использовать формат GL_RGBA8 вместо GL_RGBA (не знаю, как вам удалось получить GL_RGBA32F, как показано на первом изображении с неизменным перечислением GL_RGBA …).