glFramebufferTexture的textarget参数有什么意义?

时间:2013-06-13 16:17:45

标签: opengl

根据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 个答案:

答案 0 :(得分:14)

因为愚蠢而存在。

请参阅将face of a cubemap附加到FBO的方法是使用立方体贴图面纹理目标之一。因此,如果要绑定立方体贴图的+ X面,则使用GL_TEXTURE_CUBE_MAP_POSITIVE_X​目标。纹理的绑定目标(如果你绑定它)将是GL_TEXTURE_CUBE_MAP,但当你想要将一个面附加到FBO时,你传递给textarget的内容。< / p>

这是愚蠢的,因为OpenGL还提供了glFramebufferTextureLayer函数,该函数不带textarget个参数。它只从对象中正确识别纹理的类型。它适用于3D纹理,1D和2D数组,甚至cubemap array textures。但它在非阵列立方体贴图上不起作用;你仍然必须使用愚蠢的glFramebufferTexture2D愚蠢的textarget参数。

根据所有权利,您应使用的唯一功能是glFramebufferTextureLayerglFramebufferTexture。但是由于glFramebufferTextureLayer对非数组立方体贴图面不起作用,您必须对非数组立方体贴图的面使用glFramebufferTexture2D


感谢ARB_direct_state_access(因此也就是OpenGL 4.5),这种愚蠢不再适用。 glFramebufferTextureLayer现在可以在非数组立方体贴图面上使用,因此现在没有任何基于维度的FramebufferTexture函数。因此,textarget没有意义。