glBindTexture(GL_TEXTURE_2D, 0) glBindFramebuffer(GL_FRAMEBUFFER, 0) glBindTexture(GL_TEXTURE_2D, 0)

glBindTexture(GL_TEXTURE_2D, 0) glBindFramebuffer(GL_FRAMEBUFFER, 0) glBindTexture(GL_TEXTURE_2D, 0) 含义详解


void glBindTexture(GLenum  target, GLuint  texture);

官方解释:https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glBindTexture.xml

The value zero is reserved to represent the default texture for each texture target. 


texture 指明一张纹理的名字

在每个纹理目标中,0被保留用以代表默认纹理。


当一张纹理被第一次绑定时,它假定成为指定的目标类型。例如,一张纹理若第一次被绑定到GL_TEXTURE_1D上,就变成了一张一维纹理;若第一次被绑定到GL_TEXTURE_2D上,就变成了一张二维纹理。

由于OpenGL是状态机,当使用glBindTexture绑定一张纹理后,如果不再绑定新的纹理,则OpenGL之后的操作都会对应此纹理,当一个纹理与目标绑定时,该目标之前的绑定关系将自动被打破。


纹理名称与相应的纹理内容位于当前GL rendering上下文的共享对象空间中。


glBindVertexArray

https://www.khronos.org/opengl/wiki/GLAPI/glBindVertexArray

https://www.khronos.org/registry/OpenGL-Refpages/es3.0/

void glBindVertexArray(GLuint array​);

zero to break the existing vertex array object binding.

 zero to bind the default vertex array object binding


glBindFramebuffer

https://www.khronos.org/opengl/wiki/GLAPI/glBindFramebuffer

https://www.khronos.org/registry/OpenGL-Refpages/es3.0/

void glBindFramebuffer(GLenum target​, GLuint framebuffer​);

In order that access to the default framebuffer is not lost, it is treated as a framebuffer object with the name of zero. The default framebuffer is therefore rendered to and read from while zero is bound to the corresponding targets.

zero to break the existing binding of a framebuffer object to target .


glBindRenderbuffer

https://www.khronos.org/opengl/wiki/GLAPI/glBindRenderbuffer

zero to break the existing binding of a renderbuffer object to target .


glBindBuffer

void glBindBuffer(GLenum target​, GLuint buffer​);

https://www.khronos.org/opengl/wiki/GLAPI/glBindBuffer

值零保留,但每个缓冲区对象目标没有默认缓冲区对象。 相反,缓冲区设置为零有效地解除绑定先前绑定的任何缓冲区对象,并恢复该缓冲区对象目标的客户端内存使用(如果该目标支持的话)。 


常用的恢复OpenGL默认状态的代码:

glBindVertexArray(0);//VAO绑定到默认的VAO处,一般用于打破之前的VAO绑定关系,使OpenGLVAO绑定状态恢复到默认状态

glBindFramebuffer(GL_FRAMEBUFFER, 0);//framebuffer绑定到默认的FBO处,一般用于打破之前的FBO绑定关系,使OpenGLFBO绑定状态恢复到默认状态。

glBindTexture(GL_TEXTURE_2D, 0); //2D纹理绑定到默认的纹理,一般用于打破之前的纹理绑定关系,使OpenGL的纹理绑定状态恢复到默认状态。

glBindRenderbuffer(GL_RENDERBUFFER, 0); //将渲染buffer绑定到默认的渲染buffer,一般用于打破之前的渲染buffer绑定关系,使OpenGL的渲染buffer绑定状态恢复到默认状态。

glBindBuffer(GL_ARRAY_BUFFER, 0);//将顶点数据buffer和之前的绑定关系进行解绑 用于打破之前的顶点数据buffer的绑定关系,使OpenGL的顶点数据buffer绑定状态恢复到默认状态。

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);//将顶点索引数据buffer和之前的绑定关系进行解绑 用于打破之前的顶点索引数据buffer的绑定关系,使OpenGL的顶点索引数据buffer绑定状态恢复到默认状态。








  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用 GL_TEXTURE_EXTERNAL_OES 进行离屏渲染需要使用 FBO(FrameBuffer Object)和 GLES3 的扩展功能。 首先,创建一个 FBO,然后将一个 GL_TEXTURE_EXTERNAL_OES 纹理附加到 FBO 的颜色附件上。然后,在片段着色器中使用外部纹理 sampler2D 类型的 uniform 变量来采样这个 GL_TEXTURE_EXTERNAL_OES 纹理。 下面是一些示例代码,展示了如何使用 GL_TEXTURE_EXTERNAL_OES 进行离屏渲染: ``` // 创建 FBO GLuint fboId; glGenFramebuffers(1, &fboId); glBindFramebuffer(GL_FRAMEBUFFER, fboId); // 创建 GL_TEXTURE_EXTERNAL_OES 纹理 GLuint texId; glGenTextures(1, &texId); glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId); glTexImage2D(GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // 将 GL_TEXTURE_EXTERNAL_OES 纹理附加到 FBO 的颜色附件上 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, texId, 0); // 检查 FBO 完整性 GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { // FBO 创建失败,需要处理错误 ... // 在片段着色器中使用外部纹理 sampler2D 类型的 uniform 变量来采样 GL_TEXTURE_EXTERNAL_OES 纹理 // 例如: #version 300 es precision mediump float; uniform samplerExternalOES uTexture; in vec2 vTexCoord; out vec4 oFragColor; void main() { oFragColor = texture(uTexture, vTexCoord); } // 渲染到 FBO glBindFramebuffer(GL_FRAMEBUFFER, fboId); glViewport(0, 0, width, height); ... // 绘制场景 ... // 读取渲染结果 glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId); glGetTexImage(GL_TEXTURE_EXTERNAL_OES, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); ``` 需要注意的是,使用 GL_TEXTURE_EXTERNAL_OES 进行离屏渲染需要设备支持 OES_EGL_image_external 扩展。另外,由于外部纹理的不同使用方式,离屏渲染时需要使用不同的渲染流程和代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值