Не могу создать 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 целях рендеринга за один проход кажется безумной.
Рассмотрим следующие вещи:
- старайтесь максимально уменьшить количество целей рендеринга, не храните избыточную информацию (например, положение вершины), которую можно легко вычислить на лету (вам нужна только глубина, и в любом случае у вас обычно есть привязка глубины)
- используйте умные кодировки, подходящие для данных, то есть 3x
float
для нормального вектора это огромная трата. См., Например, обзор эффективных представлений для независимых векторов единиц - объединить различные цели рендеринга. т.е. если вам нужен
vec3
и 2vec2
выходы, лучше использовать 2vec4
цели и присвоить 8 значений 8 каналам - может быть, даже использовать более высокие форматы bitdepth, такие как
RGBA32UI
и вручную кодировать разные значения в один канал
Если вам все еще нужно больше данных, вы можете сделать несколько проходов рендеринга (в основном с n/8
цели для каждого прохода). Другой альтернативой может быть использование загрузки / сохранения изображений или SSBO в вашем фрагментном шейдере для записи дополнительных данных. В вашем сценарии использование загрузки / сохранения изображений представляется наиболее целесообразным, так как вы, вероятно, нуждаетесь в полученных данных в качестве текстуры. Вы также получаете относительно хороший шаблон доступа, так как вы можете в основном использовать gl_FragCoord.xy
для адресации изображения. Однако следует проявлять осторожность, если в одном вызове отрисовки есть перекрывающаяся геометрия, чтобы вы записывали в каждый пиксель более одного раза (эта проблема также решается GL_ARB_fragment_shader_interlock
расширение, но это еще не является основной функцией OpenGL). Однако вы можете полностью исключить этот сценарий, используя предварительный проход.