OpenGL несколько целей рендеринга и мультисэмплинг

У меня проблемы с использованием явного мультисэмплинга при использовании нескольких целей рендеринга в 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 буфера дро определенно все еще установлены.

4 буфера рисования установлены.

0

Решение

glTexParameterf нельзя использовать с GL_TEXTURE_2D_MULTISAMPLE.

Помимо этого, я бы установил для параметра ‘fixedsamplelocations’ из glTexImage2DMultisample значение true, чтобы быть в безопасности в отношении совместимости оборудования.

И я рекомендую использовать формат GL_RGBA8 вместо GL_RGBA (не знаю, как вам удалось получить GL_RGBA32F, как показано на первом изображении с неизменным перечислением GL_RGBA …).

0

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


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