Не могу создать FBO с более чем 8 буферов рендеринга - PullRequest
0 голосов
/ 11 февраля 2019

Итак, вот проблема.У меня есть 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 Ответ

0 голосов
/ 11 февраля 2019

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

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

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

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

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

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

...