news 2026/7/3 19:44:47

OpenGL的帧缓冲和纹理使用逻辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenGL的帧缓冲和纹理使用逻辑

一、先简单说一下OpenGL的纹理使用

本质上还是状态机,要把加载的图片放到插槽里面,然后着色器通过访问插槽去拿到纹理。因此纹理从加载到使用需要经历如下步骤(1-5可以写成一个纹理加载函数):

1.先绑定纹理,告诉opengl接下来的操作在这个id上:glBindTexture(GL_TEXTURE_2D, textureID);

2.上传纹理数据:glTexImage2D(GL_TEXTURE_2D, 0, format,
width, height, 0,
format, GL_UNSIGNED_BYTE, data);

3.设置mimap(自动生成多级纹理):glGenerateMipmap(GL_TEXTURE_2D);

4.设置纹理环绕方式(横向和竖向,也就是超过0-1的坐标如何重复去做):
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
5.设置放大缩小的过滤方式(一般是mimap+线性插值算法): glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

6.渲染时一定要先激活纹理单元,并绑定纹理上去:

glActiveTexture(GL_TEXTURE0);

glBindTexture(GL_TEXTURE_2D, diffuseMap);

glActiveTexture(GL_TEXTURE1);

glBindTexture(GL_TEXTURE_2D, specularMap);

7.此时在Fragment shader里面才可以通过sampler2D + 变量名 去访问到纹理:

sampler2D diffuse;

sampler2D specular;

vec3 ambient = light.ambient * texture(diffuse, TexCoords).rgb;

二、OpenGL帧缓冲(FBO)

帧缓冲顾名思义,就是自己创建一个缓冲来存放临时数据。帧缓冲其实只是一个容器,不能单独使用,必须绑定颜色附件或者再加上一个深度/模板缓冲,颜色附件其实就是一个纹理,只不过这个纹理不是读进来的,而是创建一个空白的内存。深度和模板缓冲一般用渲染缓冲对象(rbo),这个没有什么特别的,只是因为这两个东西不需要采样,因此换了一个高效的数据格式,如果需要采样深度,其实也可以用纹理附件去存深度。

下面是帧缓冲的创建:

//1.创建帧缓冲 unsigned int framebuffer; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); //2.创建并添加纹理附件 unsigned int textureColorbuffer; glGenTextures(1, &textureColorbuffer); glBindTexture(GL_TEXTURE_2D, textureColorbuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH, SCR_HEIGHT, 0, GL_RGB, 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, textureColorbuffer, 0); // 3.创建rbo用来做深度缓冲 unsigned int rbo; glGenRenderbuffers(1, &rbo); glBindRenderbuffer(GL_RENDERBUFFER, rbo); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, SCR_WIDTH, SCR_HEIGHT); // use a single renderbuffer object for both a depth AND stencil buffer. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);

下面是帧缓冲的使用:

//1.绑定缓冲为自己创建的帧缓冲,保证接下来渲染的内容放到帧缓冲 glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glEnable(GL_DEPTH_TEST); // enable depth testing (is disabled for rendering screen-space quad) //渲染前清理一下buffer glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //渲染 . . . //2.切换绑定的缓冲到默认缓冲 glBindFramebuffer(GL_FRAMEBUFFER, 0); //同样清理一下缓冲 glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //接下来绑定纹理附件到纹理,此时去fragment shader操作就相当于是对纹理后处理 glBindTexture(GL_TEXTURE_2D, textureColorbuffer); //渲染 . . .
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/3 19:42:26

精准选型:计量泵如何在工业应用中发挥关键作用

在现代工业生产中,精确的流体计量已成为确保工艺流程稳定性和产品质量的关键环节。计量泵作为专门用于精确输送和计量流体的设备,在化工、制药、水处理、食品加工等多个领域发挥着不可替代的作用。随着工业自动化水平的不断提升,对计量泵的选…

作者头像 李华
网站建设 2026/7/3 19:41:55

阿里云代理商:阿里云CPFS 数据备份任务全解析

PFS 备份计划创建后,云备份会按预设时间自动执行任务:首次备份:全量备份(完整数据快照)后续备份:默认增量备份(仅备份变化数据)优势:确保数据完整性,减少网络…

作者头像 李华
网站建设 2026/7/3 19:40:59

新型工业化:新一代智能制造成主攻方向

文|诺云集团企策通新型工业化划定的路线图,可以概括为五个关键词——长期任务、三大方向、主攻路径、未来引擎、开放格局。以下逐一拆解。一、“长期战略任务”再定调:锚定2035不动摇推进新型工业化是一项长期战略任务。 这句话既是定调,也是…

作者头像 李华
网站建设 2026/6/27 6:15:52

2026最新命理软件选择推荐:命理排盘软件和易学入门 App 怎么看?

很多人搜索“命理软件推荐”“命理排盘软件推荐”“易学入门 App 推荐”“易学排盘软件推荐”时,通常不是只想看到一个软件名称,而是想解决一个更基础的问题:刚开始接触八字排盘、命理术语和易学内容,应该怎样判断一款工具是否适合…

作者头像 李华
网站建设 2026/6/27 6:14:40

计算机Java毕设实战-基于 SpringBoot 的社区智能健康管理平台的设计与实现 基于 SpringBoot 的社区居民健康服务系统的设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华