Не могу создать FBO с более чем 8 буферов рендеринга

Итак, вот проблема. У меня есть FBO с 8 буферами рендеринга, которые я использую в своем конвейере отложенного рендеринга. Затем я добавил еще один буфер рендеринга, и теперь я получаю GLError.

GLError(
err = 1282,
description = b'invalid operation',
baseOperation = glFramebufferTexture2D,
cArguments = (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, 12, 0,)

Код должен быть в порядке, так как я только что скопировал его из ранее использованного буфера рендеринга.

glMyRenderBuffer = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, glMyRenderBuffer)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, self.width, self.height, 0, GL_RGB, GL_FLOAT, None)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, glMyRenderBuffer, 0)
glGenerateMipmap(GL_TEXTURE_2D)

И я получаю ошибку в этой строке

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT8, GL_TEXTURE_2D, glMyRenderBuffer, 0)

Это больше похоже на какое-то ограничение OpenGL, о котором я не знаю.

И у меня также есть странный стек - Linux + GLFW + PyOpenGL что также может вызвать эту проблему.

Буду рад любому совету на данный момент.

1 ответ

Решение

Это больше похоже на какое-то ограничение OpenGL, о котором я не знаю.

Соответствующий лимит GL_MAX_COLOR_ATTACHMENTS и спецификация гарантирует, что это значение по крайней мере 8,

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

Рассмотрим следующие вещи:

  • старайтесь максимально уменьшить количество целей рендеринга, не храните избыточную информацию (например, положение вершины), которую можно легко вычислить на лету (вам нужна только глубина, и в любом случае у вас обычно есть привязка глубины)
  • используйте умные кодировки, подходящие для данных, то есть 3xfloat для нормального вектора это огромная трата. См., Например, обзор эффективных представлений для независимых векторов единиц
  • объединить различные цели рендеринга. т.е. если вам нужен vec3 и 2 vec2 выходы, лучше использовать 2 vec4 цели и присвоить 8 значений 8 каналам
  • может быть, даже использовать более высокие форматы bitdepth, такие как RGBA32UI и вручную кодировать разные значения в один канал

Если вам все еще нужно больше данных, вы можете сделать несколько проходов рендеринга (в основном с n/8 цели для каждого прохода). Другой альтернативой может быть использование загрузки / сохранения изображений или SSBO в вашем фрагментном шейдере для записи дополнительных данных. В вашем сценарии использование загрузки / сохранения изображений представляется наиболее целесообразным, так как вы, вероятно, нуждаетесь в полученных данных в качестве текстуры. Вы также получаете относительно хороший шаблон доступа, так как вы можете в основном использовать gl_FragCoord.xy для адресации изображения. Однако следует проявлять осторожность, если в одном вызове отрисовки есть перекрывающаяся геометрия, чтобы вы записывали в каждый пиксель более одного раза (эта проблема также решается GL_ARB_fragment_shader_interlock расширение, но это еще не является основной функцией OpenGL). Однако вы можете полностью исключить этот сценарий, используя предварительный проход.

Другие вопросы по тегам