Я хочу определить размер (ширину, высоту) объекта кадрового буфера.
Я создал объект framebuffer через
// create the FBO.
glGenFramebuffers(1, &fboId);
Как я могу получить размер первого цветового вложения, учитывая только идентификатор объекта кадрового буфера (fboId
)?
Возможно ли это, или я должен сохранить размер цветового вложения во внешней переменной, чтобы узнать позже размер FBO?
Ваш вопрос несколько запутан, поскольку вы спрашиваете о двух разных вещах.
Вот простой вопрос:
Как я могу получить размер первого цветового вложения, учитывая только идентификатор объекта кадрового буфера (fboId)?
Это просто: получите текстурный / рендер-буфер, прикрепленный к этому вложению, получите уровень mipmap и слой массива, а затем запросите текстурный / рендер-буфер для определения его размера.
Первые два шага сделаны с glGetFramebufferAttachmentParameter
(обратите внимание на ключевое слово «Приложение») для GL_COLOR_ATTACHMENT0
, Вы запрашиваете GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE
чтобы получить, будь то рендер-буфер или текстура. Вы можете получить название renderbuffer / texture с помощью GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
,
Если объект является renderbuffer, вы можете связать renderbuffer и использовать glGetRenderbufferParameter
получить рендербуфер GL_RENDERBUFFER_WIDTH
а также GL_RENDERBUFFER_HEIGHT
,
Если объект является текстурой, вам нужно будет сделать больше работы. Вам необходимо запросить параметр вложения GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL
чтобы получить уровень MIPMAP.
Конечно, теперь вам нужно знать, как это связать. Если вы используете версии OpenGL до 4.4 или без определенных расширений, то это сложно. Видите, вам нужно знать, какие тип цели текстуры использовать. Это может показаться глупым и раздражающим, но единственный способ определить цель по имени объекта текстуры — это … попробовать все. Пройдите каждую цель и проверьте glGetError
, Тот, для которого GL_INVALID_OPERATION
не вернулся правильный.
Если у вас GL 4.4 или ARB_multi_bind доступно, вы можете просто использование glBindTextures
(обратите внимание на «s»), что не требует указания цели. И если у вас есть 4,5 или ARB_direct_state_access, вам не нужно связывать текстуру вообще. Функции стиля DSA не нуждаются в целевом объекте текстуры, и это также обеспечивает glBindTextureUnit
, который привязывает текстуру к своей естественной внутренней цели.
Как только у вас будет привязана текстура и уровень mipmap, вы использование glGetTexLevelParameter
запросить GL_TEXTURE_WIDTH
а также GL_TEXTURE_HEIGHT
для этого уровня.
Теперь это легко проблема. Сложная проблема в том, что спрашивает ваш заголовок:
Я хочу определить размер (ширину, высоту) объекта кадрового буфера.
Размер области визуализации FBO составляет не то же самое как размер GL_COLOR_ATTACHMENT0
, Область визуализации FBO — это пересечение всех размеров всех изображений, прикрепленных к FBO.
Если вы не обладаете особыми знаниями об этом FBO, вы не можете предполагать, что FBO содержит только одно изображение или что все изображения имеют одинаковый размер (и если у вас есть специальные знания о FBO, то, честно говоря, вам следует также иметь специальные знания о том, насколько он большой). Так что вам нужно будет повторить вышеописанную процедуру для каждый вложение (если тип GL_NONE
тогда ничего не прилагается). Затем возьмите пересечение возвращаемых значений (то есть: наименьшая ширина и высота).
В общем, вам не нужно спрашивать FBO, которое вы создали, насколько оно велико. Так же, как вам не нужно спрашивать текстуры, насколько они велики. Вы сделали их; по определению вы знаете, насколько они велики. Вы положили их в FBO, так что вы снова знаете, насколько он большой.
Других решений пока нет …