Какова точка параметра textarget для glFramebufferTexture?

В соответствии с http://www.opengl.org/sdk/docs/man/xhtml/glFramebufferTexture.xml вызов glFramebufferTexture должен выглядеть примерно так:

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);

Если API уже знает textureId, почему он должен знать цель (GL_TEXTURE_2D) тоже? Означает ли это, что текстура должна быть связана перед этим вызовом? то есть мне нужно позвонить:

glBindTexture(GL_TEXTURE_2D, textureId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
glBindTexture(GL_TEXTURE_2D, 0);

Или будет glFramebufferTexture2D обрабатывать все?

Ответ 1

Это там из-за глупости.

Видите ли, способ, которым вы прикрепляете грань кубической карты к FBO, заключается в использовании одной из целей текстуры граней кубической карты. Поэтому, если вы хотите прикрепить грань +X кубической карты, вы используете цель GL_TEXTURE_CUBE_MAP_POSITIVE_X​. Целью привязки текстуры (если вы ее связывали) будет GL_TEXTURE_CUBE_MAP, но это не то, что вы передаете textarget, когда хотите прикрепить лицо к FBO.

Это глупо, потому что OpenGL также предоставляет функцию glFramebufferTextureLayer, которая не принимает параметр textarget. Он правильно определяет тип текстуры только из объекта. Он работает с трехмерными текстурами, одномерными и двумерными массивами и даже текстурами массива кубических карт. Но это не работает на кубических картах без массивов; вам все равно придется использовать глупый glFramebufferTexture2D с этим глупым параметром textarget.

По праву, единственные функции, которые вы должны использовать, это glFramebufferTextureLayer и glFramebufferTexture. Но из-за того, что glFramebufferTextureLayer не работает на гранях куба без массива, вы должны использовать glFramebufferTexture2D для граней кубической карты не массива.


Благодаря ARB_direct_state_access (и, следовательно, OpenGL 4.5), этот идиотизм больше не применяется. glFramebufferTextureLayer теперь можно использовать на гранях нематериальных кубических карт, поэтому теперь нет смысла ни для одной из основанных на измерениях функций FramebufferTexture. И поэтому, нет смысла textarget.