openGL API之glFramebufferTexture2D函数详解

前言

将2维纹理对象绑定到帧缓冲区,帧缓冲区本身是不存放颜色、深度等信息的,这些信息需要通过纹理、深度缓存来存放,这些缓存可以绑定到帧缓冲区上。

这种绑定关系会被opengl记录,不会随着当前帧缓冲区改变而改变。因而这个帧缓冲区和纹理单元有点类似,绑定到纹理单元的纹理对象,也会被opengl记录,不会随着当前纹理单元的改变而改变。不同的是纹理单元与纹理对象的绑定关系是隐式进行的(不需要手工绑定),而帧缓冲区与纹理对象的绑定是显式进行的。

 

名称

glFramebufferTexture2D - 将纹理图像附加到帧缓冲对象

C规范

void glFramebufferTexture2D(GLenum target,

                                                          GLenum attachment,

                                                          GLenum textarget,

                                                          GLuint texture,

                                                          GLint level);

参数

target

指定帧缓冲目标。 符号常量必须是GL_FRAMEBUFFER

attachment

指定应附加纹理图像的附着点。 必须是以下符号常量之一:GL_COLOR_ATTACHMENT0GL_DEPTH_ATTACHMENTGL_STENCIL_ATTACHMENT

textarget

指定纹理目标。 必须是以下符号常量之一:GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP_POSITIVE_XGL_TEXTURE_CUBE_MAP_NEGATIVE_XGL_TEXTURE_CUBE_MAP_POSITIVE_YGL_TEXTURE_CUBE_MAP_NEGATIVE_YGL_TEXTURE_CUBE_MAP_POSITIVE_ZGL_TEXTURE_CUBE_MAP_NEGATIVE_Z

texture

指定要附加图像的纹理对象。

level

指定要附加的纹理图像的mipmap级别,该级别必须为0。

描述

glFramebufferTexture2Dtexturelevel指定的纹理图像附加为当前绑定的帧缓冲区对象的逻辑缓冲区之一。 attachment指定是否应将纹理图像附加到帧缓冲对象的颜色,深度或模板缓冲区。 纹理图像不可以附加到默认(名称为0)的帧缓冲对象。

如果texture不为0,则指定附加点的GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE的值设置为GL_TEXTUREGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME的值设置为textureGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL的值设置为level。 如果纹理是立方体贴图纹理,则GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE的值设置为textarget; 否则将其设置为默认值GL_TEXTURE_CUBE_MAP_POSITIVE_X。 先前绑定的帧缓冲区对象的附件逻辑缓冲区都将被破坏。

如果texture为0,则分离附加到当前绑定的帧缓冲区对象的附件逻辑缓冲区的当前图像(如果有的话)。 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE的值设置为GL_NONE。 GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME的值设置为0GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVELGL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE分别设置为默认值0GL_TEXTURE_CUBE_MAP_POSITIVE_X

注意

当纹理对象当前被绑定并可能被当前顶点或片段着色器采样时,需要采取特殊预防措施以避免将纹理图像附加到当前绑定的帧缓冲区。这样做可能导致在通过渲染操作写入像素和在当前绑定纹理中用作纹素时同时读取那些相同像素之间创建“反馈循环”。在这种情况下,帧缓冲区将被视为帧缓冲区完成,但在此状态下渲染的片段的值将是未定义的。纹理样本的值也可能是未定义的。

如果在将图像附加到当前绑定的帧缓冲区时删除纹理对象,这就好比使用纹理0调用glFramebufferTexture2D作为此图像附加到当前绑定的帧缓冲区对象中的附着点。换句话说,纹理图像与当前绑定的帧缓冲区分离了。请注意,纹理图像不会与任何未绑定的帧缓冲区分离。从任何非绑定帧缓冲区中分离映像是应用程序的责任。

错误

GL_INVALID_ENUM target不是GL_FRAMEBUFFER

GL_INVALID_ENUM texture不为0时textarget不是可接收的纹理target。

GL_INVALID_ENUM attachment是不可接收的附着点。

GL_INVALID_VALUE level不是0时,texture不是0。

GL_INVALID_OPERATION :如果绑定了默认的帧缓冲对象名称0。

GL_INVALID_OPERATION :如果texture既不是0也不是现有纹理对象的名称。

GL_INVALID_OPERATION :如果texture是现有二维纹理对象的名称,但textarget不是GL_TEXTURE_2D,或者texture是现有立方体贴图纹理对象的名称,但textargetGL_TEXTURE_2D

相关Gets

glGetFramebufferAttachmentParameteriv

另见

glBindFramebuffer,glBindTexture,glCheckFramebufferStatusglDeleteFramebuffersglDeleteTexturesglFramebufferRenderbufferglGenerateMipmapglGetFramebufferAttachmentParameterivglTexImage2D

版权

https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glFramebufferTexture2D.xml

https://blog.csdn.net/flycatdeng

 

 

个人理解

void glFramebufferTexture2D(     GLenum target,
      GLenum attachment,
      GLenum textarget,
      GLuint texture,
      GLint level);

target

    Specifies the target to which the framebuffer is bound for all commands except glNamedFramebufferTexture.

指定当前帧缓冲区的操作类型,可以取GL_DRAW_FRAMEBUFFER, GL_READ_FRAMEBUFFER, GL_FRAMEBUFFER之一,GL_DRAW_FRAMEBUFFER表示当前帧缓冲区为写类型,GL_READ_FRAMEBUFFER表示当前帧缓冲区为读类型,GL_FRAMEBUFFER等同于GL_DRAW_FRAMEBUFFER(与glBindFramebuffer中的含义不一致,那里面等同于GL_DRAW_FRAMEBUFFER,和GL_READ_FRAMEBUFFER)。

attachment

    Specifies the attachment point of the framebuffer.

指定纹理对象在帧缓冲区中的挂载点,可以取GL_COLOR_ATTACHMENTi, GL_DEPTH_ATTACHMENT, GL_STENCIL_ATTACHMENT or GL_DEPTH_STENCIL_ATTACHMENT。GL_COLOR_ATTACHMENTi表示颜色挂载点,可以有多个颜色挂载点,i的范围为0~GL_MAX_COLOR_ATTACHMENTS-1。GL_DEPTH_ATTACHMENT表示深度挂载点。GL_STENCIL_ATTACHMENT表示模板挂载点。GL_DEPTH_STENCIL_ATTACHMENT表示同时挂载到深度和模板挂载点。

textarget

    For glFramebufferTexture1D, glFramebufferTexture2D and glFramebufferTexture3D, specifies what type of texture is expected in the texture parameter, or for cube map textures, which face is to be attached.

指定纹理对象中的目标类型,这个和glBindTexture中的目标类型是有区别的。可以取 GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, or GL_TEXTURE_2D_MULTISAMPLE。GL_TEXTURE_2D表示纹理对象中的二维纹理,glBindTexture绑定GL_TEXTURE_2D的情况下。GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z表示使用立方体纹理的哪一个面,glBindTexture绑定GL_TEXTURE_CUBE的情况下。GL_TEXTURE_2D_MULTISAMPLE表示***,glBindTexture绑定 GL_TEXTURE_2D_MULTISAMPLE的情况下。

texture

    Specifies the name of an existing texture object to attach.

指定纹理对象的名字,与glGenTexture一致。

level

    Specifies the mipmap level of the texture object to attach.

openGL之API学习(十五)glFramebufferTexture2D_第1张图片

参考:

作者

作者2:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
glFramebufferTexture2DOpenGL中的一个函数,用于将纹理对象附加到帧缓冲对象的指定附着点上。帧缓冲对象用于在渲染过程中存储图像数据,可以用于实现离屏渲染、渲染到纹理等功能。 调用glFramebufferTexture2D函数需要指定帧缓冲目标、附着点、纹理目标、纹理对象和纹理级别。以下是一个使用glFramebufferTexture2D函数的示例: ```c++ GLuint fbo, texture; // 创建和配置帧缓冲对象和纹理对象 glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 将纹理对象附加到帧缓冲对象的附着点上 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); ``` 在这个示例中,我们首先使用glGenFramebuffers函数生成了一个帧缓冲对象的名称,并使用glBindFramebuffer函数将其绑定到渲染管线的帧缓冲目标上。然后,我们使用glGenTextures函数生成了一个纹理对象的名称,并使用glBindTexture函数将其绑定到纹理目标上。接着,我们使用glTexImage2D函数设置了纹理对象的大小和格式,并使用glTexParameteri函数设置了纹理对象的过滤方式。最后,我们使用glFramebufferTexture2D函数将纹理对象附加到帧缓冲对象的附着点上。 需要注意的是,调用glFramebufferTexture2D函数会将指定的纹理对象附加到指定的帧缓冲对象的附着点上,如果同一附着点已经被占用,则会替换之前的附着对象。可以使用glFramebufferRenderbuffer函数将渲染缓冲对象附加到帧缓冲对象的附着点上。 希望这个回答对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值