首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

OpenGL 之 缓冲 使用实践

缓冲(Framebuffer Object),简称 FBO,在渲染绘制中, 图像最终都是绘制到 FBO 上的,一般都是默认的 FBO 上,也就是我们的屏幕。...缓冲与渲染缓冲和纹理的关系如下: ? 使用概述 缓冲的使用,首先就创建对应的缓冲对象,然后给它添加对应的附件,比如颜色附件或者深度附件等。...接着就是切换到缓冲渲染,在缓冲中进行绘制,此时绘制的内容都是记录在上一步添加的颜色附件或者深度附件上了。...然后切换到屏幕的缓冲区,这时可以把缓冲中记录的颜色或者深度信息取出来,再把他们绘制到屏幕上。...缓冲的使用看似很简单,但是用处却很普遍,使用缓冲可以在一些相机应用中做美颜处理、滤镜处理,也可以用来作贴纸等等效果。 使用步骤 创建 FBO 按照上面的步骤,首先是创建 FBO 。

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

17.opengl高级-缓冲(1)

一、为什么使用缓冲区对象 默认情况下,opengl 使用窗口系统提供的缓冲区作为绘图表面,如果应用程序只是在屏幕上绘图,则窗口系统提供的缓冲区通常很高效。...进一步理解缓冲对象 注意:缓冲本质上是个manager,本身并没有数据,实际的数据在颜色缓冲区、深度缓冲区、模板缓冲区中,manager只是管理这些有数据的缓冲区,对这些缓冲区的引用叫“附件”,参考下图...>离屏绘制-->切换到默认屏幕缓冲-->将前面的缓冲数据绘制到当前屏幕 这里用到了两个shader,第二个screenshader是二维的,因为自定义缓冲数据已经是处理好的二维数据,所以深度测试也没意义...实现效果: 缓冲实现简单代码 缓冲线框图 PS:如上图,缓冲的线框图是两个三角形,说明离屏渲染的缓冲就是一个普通的纹理,贴到两个三角形上 五、补充 缓冲完整代码: #include <glad...csdn-OpenGL之缓冲 从0开始的OpenGL学习(二十二)-缓存 learnopengl-缓冲

1.6K30

嵌入式Linux下完成LCD屏文字显示(缓冲框架)

1.前言 缓冲框架是Linux下专门为显示类设备设计的接口,目的是将硬件和软件层分离开,方便应用层的编程,也方便应用层程序移植。...缓冲框架向驱动层和应用层分别提供了一套标准接口,驱动层按照框架编写驱动,应用层按照框架编写应用程序。缓冲在/dev目录下生成的标准节点是fb,比如:/dev/fb0,/dev/fb1等等。...这篇文章就介绍在应用层 如何利用缓冲框架接口封装LCD屏的画点函数,获取LCD屏的硬件信息,完成对LCD屏编程,实现文字、数字显示。...当期的文字采用点阵方式取模来完成显示,比较简单,与单片机上的LCD编程思路一样,可以更方便快速学习缓冲编程。...编程思路 下面是缓冲框架图: 缓冲设备是标准的字符设备,通过open函数打开设备,再通过ioctl接口获取LCD屏的一些硬件参数信息,在利用mmap函数映射LCD屏的地址到应用层。

1.5K40

OpenGL ES 3.0 缓冲区失效

OpenGL ES 3.0 缓冲区失效 很多朋友都听说过 glInvalidateFramebuffer(缓冲区失效)这个 API ,很多读者私信问过很多次:缓冲区失效应该怎么使用?...如果指定的附件在绑定缓冲区中不存在,则会被忽略。...有了缓冲区失效机制,GPU 就可以删除不再需要的顿缓冲区内容,以减少每个保留的内容数量。...缓冲区失效机制实际上是一种更加细化的优化方式,主要为了降低功耗,在一定程度上可以优化性能。 缓冲区失效机制应该在什么情况下使用?怎么使用?...缓冲区失效机制在多重采样反锯齿中使用的例子: //上面完成了渲染到多重采样缓冲区 mMSAAFramebuffer //接下来进行位块传送将多重采样缓冲区内容“拷贝”到普通的缓冲

19110

OpenGL ES 缓冲区位块传送

前文 《OpenGL ES 多目标渲染(MRT)》中我们了解了利用 MRT 技术可以一次渲染到多个缓冲区,本文将利用缓冲区位块传送实现高性能缓冲区之间的像素拷贝。...OpenGL ES 缓冲区位块传送 缓冲区位块传送(Blit)也是 OpenGL ES 3.0 的新特性,主要用于缓冲区之间的像素拷贝,性能高且使用方便,可以指定缓冲区任意矩形区域的像素拷贝。...缓冲区位块传送(Blit)api 本文的绘制流程是,新建一个 FBO 绑定纹理作为颜色附着,然后绑定该缓冲区进行一次离屏渲染,最后绑定渲染到屏幕的缓冲区作为渲染缓冲区,从新的缓冲区中拷贝像素。...,需要指定好源缓冲区 GL_READ_FRAMEBUFFER 和目标缓冲区 GL_DRAW_FRAMEBUFFER,下面代码实现是将四个颜色附着对应的缓冲区像素,分别拷贝到当前渲染缓冲区中的 1/4...缓冲区位块传送(Blit) -- END --

1.4K20

【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲容量 | 缓冲大小 | 音频数据读写缓冲区 )

AAudio 音频流内部缓冲缓冲容量 BufferCapacityInFrames 与 缓冲大小 BufferSizeInFrames 区分 III ....AAudio 音频流内部缓冲缓冲容量 BufferCapacityInFrames IV . AAudio 音频流内部缓冲缓冲大小 BufferSizeInFrames V ....AAudio 音频流内部缓冲缓冲容量 BufferCapacityInFrames 与 缓冲大小 BufferSizeInFrames 区分 ---- 下面要区分两个概念 , 一个是缓冲容量..., 只使用其中一部分作为缓冲区 ; ① 缓冲大小 限制 : 缓冲大小 BufferSizeInFrames 只能小于等于 缓冲容量 BufferCapacityInFrames ; ② 设置...缓冲大小 作用 : 增加 缓冲大小 BufferSizeInFrames 会增加音频延迟 , 反之会减小延迟 ; ③ 设置缓冲大小 方法 : AAudioStreamBuilder_setBufferSizeInFrames

1.2K10

【说站】嵌入式Linux下完成LCD屏文字显示(缓冲框架)

缓冲框架是Linux下专门为显示类设备设计的接口,目的是将硬件和软件层分离开,方便应用层的编程,也方便应用层程序移植。...缓冲框架向驱动层和应用层分别提供了一套标准接口,驱动层按照框架编写驱动,应用层按照框架编写应用程序。缓冲在/dev目录下生成的标准节点是fb,比如:/dev/fb0,/dev/fb1等等。...这篇文章就介绍在应用层 如何利用缓冲框架接口封装LCD屏的画点函数,获取LCD屏的硬件信息,完成对LCD屏编程,实现文字、数字显示。...当期的文字采用点阵方式取模来完成显示,比较简单,与单片机上的LCD编程思路一样,可以更方便快速学习缓冲编程。...编程思路 下面是缓冲框架图: 缓冲设备是标准的字符设备,通过open函数打开设备,再通过ioctl接口获取LCD屏的一些硬件参数信息,在利用mmap函数映射LCD屏的地址到应用层。

74110

【Android 高性能音频】AAudio 音频流 样本缓冲 相关配置 ( 通道数 | 样本格式 | 缓冲 | 采样率 | 每样本数 == 通道数 )

: 这里的缓冲区是播放器的缓冲区 , 单位是 , 每的采样数就是通道数 , 单声道 每 1 个采样, 双声道立体声每 2 个采样 , 分别对应左右声道的采样 ; // 设置每缓冲区大小...AAudioStream_setBufferSizeInFrames( AAudioStream *stream, int32_t numFrames ) ② 代码示例 : //设置当前缓冲区是多少...bufferSize = AAudioStream_setBufferSizeInFrames(stream, bufferSize); 播放器缓冲区 : 这里的缓冲区指的是 AAudio...音频流的缓冲区 , 属于播放器 或 音频设备 的固有属性 ; 采样缓冲区 : 注意与采样缓冲区进行区分 , 采样缓冲区指的是 一次性向 AAudio 音频流 读取 或 写入的 字节数 , 注意区分这两个缓冲区...; 电流产生 : 如果两个缓冲区设置不当 , 会造成音频卡顿 , 电流 , 刺啦 或者 啪啪 的声音 ; 大小 : 这里的可以理解成一个样本 , 如果是单声道 , 每一个样本 , 如果是双声道立体声

63810

Linux】理解缓冲

3.缓冲区满——全缓冲——磁盘文件,效率最高,只需要一次IO,比如文件读写的时候,直接写到磁盘文件 但是存在特殊情况:a.用户强制刷新 b,进程退出——一般到要进行缓冲区刷新 所以对于全缓冲缓冲区满了采取刷新...3.在哪里 缓冲区的位置究竟在哪里:从上面的例子我们直接往显示器上打印结果为4条,往文件打印为7条,这跟缓冲区有关,同时这也说明了缓冲区一定不在内核中,为什么?...我们之前谈论的所有缓冲区都指的是用户级语言层面提供的缓冲区。...FILE结构体缓冲区,所以我们直接要强制刷新的时候fflush(文件指针),关闭文件fclose(文件指针),这是因为传进去的文件指针对应的缓冲区 从源码出发,我们可以来看一看FILE结构体: 所以我们一般所说的缓冲区是语言级别的缓冲区...上面的过程都和write无关,write没有FILE,而用的是fd,就没有C提供的缓冲区! 简单总结来说:重定向导致刷新策略发生了改变(由行缓冲变成了全缓冲)。

18840

OpenGL 缓冲区位块传送,不得了(附源码)

缓冲区位块传送(Blit)可以高效地将一个矩形区域的像素值从一个缓冲区(读缓冲区)复制到另一个缓冲区(绘图缓冲区)。...在项目实践中确认了缓冲区位块传送的性能和功耗优于 Draw , 此外位块传送还是支持上下采样,以及通过调整映射的矩形区域,可以实现规则的镜像和旋转功能。...还有重要的一点,在进行缓冲区间位块传之前,需要指定好源缓冲区 GL_READ_FRAMEBUFFER 和目标缓冲区 GL_DRAW_FRAMEBUFFER ,特别是使用多个 FBO 时需要注意。...缓冲区位块传送 glBlitFramebuffer: 使用位块传送的简单 demo , 在新建的缓冲区上做完离屏渲染后,直接使用 glBlitFramebuffer 进行上屏。

75150

Linux修炼】13.缓冲

缓冲区的理解 一. C接口打印两次的现象 二. 理解缓冲区问题 为什么要有缓冲缓冲区刷新策略的问题 所说的缓冲区在哪里?指的是什么缓冲区? 三. 解释打印两次的现象 四. 模拟实现 五....理解缓冲区问题 缓冲区本质就是一段内存 那么既然有了本质前提,那么就有这几个方面要思考: 缓冲区是谁申请的? 缓冲区属于谁? 为什么要有缓冲区?...因此,为了在不同设备的效率都是最合适的,缓冲区一定会结合具体的设备,定制自己的刷新策略: 立即刷新,无缓冲 行刷新,行缓冲(显示器)\n就会刷新,比如_exit和exit 缓冲区满 全缓冲...,而我们的数据则通过file结构体与文件描述符对应,再写到内核缓冲区里面,最后由操作系统刷新到磁盘中,而刷新的这个过程是由操作系统自主决定的,而不是我们刚才所讨论的一些行缓冲、全缓冲、无缓冲……,因为我们提到的这些缓冲是在应用层...,就比如我们常用的快捷键:ctrl + s 总结: 因此以上我们所提到的缓冲区有两种:用户缓冲区和内核缓冲区,用户缓冲区就是语言级别的缓冲区,对于C语言来说,用户缓冲区就在FILE结构体中,其他的语言也类似

1.8K00

CCPP 的全缓冲、行缓冲和无缓冲

磁盘文件操作通常是全缓冲的。 (2)行缓冲。输入或输出缓冲区遇到换行符会进行实际 I/O 操作(键盘输入通常是行缓冲,所以在按下Enter键时才刷新缓冲区)。其他与全缓冲相同。 (3)无缓冲。...三种缓冲类型的宏定义在头文件。 缓冲类型 宏 全缓冲 _IOFBF 行缓冲 _IOLBF 无缓冲 _IONBF Linux 环境下,下面一段代码可以很好地体现全缓冲和行缓冲的区别。...2.缓冲区的设置 (1)缓冲打开或关闭,可使用函数setbuf()或者setbuffer()。参数buf指向缓冲区,表示开启缓冲,通常是全缓冲。将buf参数设置为NULL,表示关闭缓冲。...注意,setbuffer()是非C标准库函数,常见于Linux。 setbuf() 的缓冲区长度至少为 BUFSIZ(定义在 stdio.h),否则可能会出现缓冲区溢出。...setvbuf(stream,NULL,_IOLBF,0); //将缓冲改为行缓冲 // 上面的代码等价于 setlinebuf(stream); //for Linux 如果调用setvbuf

1.2K10

C的全缓冲、行缓冲和无缓冲

为了使程序的运行效率最高,流对象通常会提供缓冲区,以减少调用系统I/O库函数的次数。 在Linux中,缓冲方式存在三种,分别是: (1)全缓冲。输入或输出缓冲区被填满,会进行实际I/O操作。...磁盘文件操作通常是全缓冲的。 (2)行缓冲。输入或输出缓冲区遇到换行符会进行实际I/O操作。其他与全缓冲相同。 (3)无缓冲。没有缓冲区,数据会立即读入内存或者输出到外存文件和设备上。...//间接申请1024字节全缓冲区 setvbuf ( stream , NULL , _IOFBF , 1024); //实测Linux无效,VS2015可以设置缓冲区大小 //以下在Windows和...Linux均有有效,显示指明全缓冲区 static char buf[1024]; setvbuf ( stream , buff, _IOFBF , 1024); 对于上面的函数,Linux和Windows...平台对setvbuf()的具体实现不尽相同,使用时也请大家注意,总结为以下几点: (1)Linux平台对设备文件默认开启行缓冲,对磁盘文件默认开启全缓冲

3K20

视频编码的三种:I,B,P

在视频压缩编码中,所有的被分成了三个种类,I,B和P,其实就是Intra-Prediction,Bi-prediction和Prediction。...顾名思义,就是内预测,双向预测以及(单向)预测。...(inter prediction),内预测的话就是在找参照块的时候,只在当前内寻找;而间预测的话,找参照块的时候会在相邻的之间去找相似块。...因此,基于上述所说, 如果说当前是只在当前内寻找参照块的话,那么该就是I 如果在已经编码的里面寻找参照块的话,那么它是P 如果既在已编码的里去寻找参照块,又在未来将要被编码的里去寻找参照块的话...,那么该就是B

2.1K20

视频中的 I ,P ,B

由于压缩处理的方式不同,视频中的画面就分为了不同的类别,其中包括:I 、P 、B 。I 是内部编码(也称为关键),P 是前向预测(前向参考),B 是双向内插(双向参考)。...简单地讲,I 是一个完整的画面,而 P 和 B 记录的是相对于 I 的变化。如果没有 I ,P 和 B 就无法解码。...I I (Intra coded frames):I 图像采用内编码方式,即只利用了单图像内的空间相关性,而没有利用时间相关性。...由于 I 不依赖其它,所以是随机存取的入点,同时是解码的基准。 I 主要用于视频播放的初始化,I 图像的压缩倍数相对较低。I 图像是周期性出现在图像序列中的,出现频率可由编码器选择。...P 是差别,P 没有完整画面数据,只有与前一的画面差别的数据。 若 P 丢失了,则视频画面会出现花屏、马赛克等现象。

2.7K20

CC++的全缓冲、行缓冲和无缓冲

磁盘文件操作通常是全缓冲的。 (2)行缓冲。输入或输出缓冲区遇到换行符会进行实际I/O操作。其他与全缓冲相同。 (3)无缓冲。没有缓冲区,数据会立即读入内存或者输出到外存文件和设备上。...缓冲类型 宏 全缓冲 _IOFBF 行缓冲 _IOLBF 无缓冲 _IONBF Linux环境下,下面一段代码可以很好地体现全缓冲和行缓冲的区别。...2.缓冲区的设置 (1)缓冲打开或关闭,可使用函数setbuf()或者setbuffer()。参数buf指向缓冲区,表示开启缓冲,通常是全缓冲。将buf参数设置为NULL,表示关闭缓冲。...注意,setbuffer()是非C标准库函数,常见于Linux。 setbuf()的缓冲区长度至少为BUFSIZ(定义在stdio.h),否则可能会出现缓冲区溢出。...setvbuf(stream,NULL,_IOLBF,0); //将缓冲改为行缓冲 //上面的代码等价于 setlinebuf(stream); //for Linux 如果调用

1.7K31

Linux内核编程--文件流与缓冲

Linux系统下,通过编程对文件进行操作的方式有两种机制:文件描述符和文件流 1.文件描述符和文件流的区别: 文件描述符的类型为int,文件流的类型为FILE*(文件指针)。...Linux内核操作文件会使用高速缓冲区。...比如write操作, 进程把数据写到缓冲区, 然后内核把数据从缓冲区写到磁盘文件。 当进程不断写入数据时,内核可以等缓冲区满了再一次性往磁盘写入,这样可以提高性能。...流程图如下: 缓冲分三种模式: (1)全缓冲,写满标准I/O缓冲区后才进行I/O操作, 例如磁盘文件(非交互式设备)的I/O操作 (2)行缓冲,在输入/输出中遇到换行符时才进行I/O操作,例如在终端进行...,mode为缓冲区类型,size为缓冲区内字节的数量 --mode参数如下: _IOFBF:全缓冲模式 _IOLBF:行缓冲模式 _IONBF:无缓冲模式 若成功则返回0,若出错则为非0 代码样例:

2.8K10

linux网络编程之TCPIP基础(五):分析一基于UDP的TFTP协议

下面分析一基于UDP的TFTP协议: 以太网首部 0000: 00 05 5d 67 d0 b1 00 05 5d 61 58 a8 08 00  IP首部 0000: 45 00 0010:...16位总长度字段(包括IP首部和IP层payload的长度)为0x0053,即83字节,加上以太网头部14+4字节校验可知整个长度是101字节。...包大小,即udp payload + udp头部 可以当作ip 层的payload,ip层payload + ip头部 = 83字节,加上以太网头部14字节,尾部校验4字节,总共101字节,即完整的一数据...3、通常接收端的UDP协议层将收到的数据放在一个固定大小的缓冲区中等待应用程序来提取和处理,如果应用程序提取和处理的速度很慢,而发送端发送的速度很快,就会丢失数据段,UDP协议层并不报告这种错误。...参考: 《Linux C 编程一站式学习》 《TCP/IP详解 卷一》

1.4K70
领券