Opengl ES中的buffers and buffering

                                 Buffers and Buffering 缓冲区和缓冲

        我们知道颜色和像素的值都是存在颜色buffer中的,然后通过加载buffer把图形显示在屏幕上。帧buffer可能是放在内存中,也可能是放在显存中。color buffer是frame buffer

的一部分,然后和frame buffer 和 video conntroller像连接,video controller负责将frame Buffer 输出到各种显示器上,video controller 通常能够把数字信号转换成模拟信号,CRT显示器属于模拟设备,需要模拟信号作为输入,LCD显示器属于数字设备,需要数字信号作为输入,但模拟信号通常也可以使用。


       刷新频率

        对于CRT来讲,屏幕上的图形图像是由一个个因电子束击打而发光的荧光点组成,由于显像管内荧光粉受到电子束击打后发光的时间很短,所以电子束必须不断击打荧光粉使其持续发光。电子枪从屏幕的左上角的第一行(行的多少根据显示器当时的分辨率所决定,比如800X600分辨率下,电子枪就要扫描600行)开始,从左至右逐行扫描,第一行扫描完后再从第二行的最左端开始至第二行的最右端,一直到扫描完整个屏幕后再从屏幕的左上角开始,这时就完成了一次对屏幕的刷新,周而复始。这样我们就能够理解,为什么显示器的分辨率越高,其所能达到的刷新率最大值就越低。一般来讲,屏幕的刷新率要达到75HZ以上,人眼才不易感觉出屏幕的闪烁,CRT显示器的刷新率是由其行频和当时的分辨率决定的,行频越高,同一分辨率下的刷新率就越高;而行频一定的情况下,分辨率越高则它所能达到的刷新率越低。 


  对于LCD来说则不存在刷新率的问题,它根本就不需要刷新。因为LCD中每个像素都在持续不断地发光,直到不发光的电压改变并被送到控制器中,所以LCD不会有“不断充放电”而引起的闪烁现象。

      Color Buffer

      根据表示颜色所用的字节数, color buffer 通常分为不同的颜色模式:

High color:每个像素用两个字节来表示,用15或16个bit来表示颜色,一共可以表示 32768或者65536种颜色。

True color/RGB color: 每个像素3-4个字节来表示,则有24bit可以用来表示颜色,有168万种不同的颜色。

       在High color中,每5个bit表示red/green/blue。剩下的一个字节用来表示alpha或者加到绿色的通道中。因为绿色对于人眼的影响最大。而且绿色的颜色不连续会非常明显。



       在True color/RGB color中,一个字节表示一个颜色,用4个字节来表示可以有加速存储的效果。还有的系统会拿出8bit来存储alpha通道,也就是传说中的RGBA表示。还有用24bit来表示RGB的,没有alpha通道,这样可以节省内存。

       

深度缓冲 Z-bufffering

       深度冲突(z-fighting)指的是场景中两个z-buffer相同的图元出现闪烁的现象。

       深度缓冲是在三维图形中处理图像深度坐标的过程,这个过程通常在硬件中完成,它也可以在软件中完成,它是可见性问题的一个解决方法。可见性问题是确定渲染场景中哪部分可见、哪部分不可见的问题。画家算法是另外一种常用的方法,尽管效率较低,但是也可以处理透明场景元素。深度缓冲也称为 Z 缓冲。
       当三维图形卡渲染物体的时候,每一个所生成的像素的深度(即 z 坐标)就保存在一个缓冲区中。这个缓冲区叫作 z 缓冲区或者深度缓冲区,这个缓冲区通常组织成一个保存每个屏幕像素深度的 x-y 二维数组。如果场景中的另外一个物体也在同一个像素生成渲染结果,那么图形处理卡就会比较二者的深度,并且保留距离观察者较近的物体。然后这个所保留的物体点深度保存到深度缓冲区中。最后,图形卡就可以根据深度缓冲区正确地生成通常的深度感知效果:较近的物体遮挡较远的物体。这个过程叫作 z 消隐。
       深度缓冲的分辨率对于场景质量有很大的影响:当两个物体非常接近的时候,16 位的深度缓冲区可能会导致“z -fighting”的人为噪声;使用 24 位或者 32 位的深度缓冲区就会表现得较好;由于精度太低,所以很少使用 8 位的深度缓冲区。


模板缓冲 Stencil Buffer

        与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号整数值。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。图形渲染管线中,基于单个像素的测试操作的顺序如下图。

        

        在模板测试的过程中,可以先使用一个比较用掩码(comparison mask)与模板缓冲区中的值进行位与运算,再与参考值进行比较,从而实现对模板缓冲区中的值的某一位上的置位状态的判断。这样,模板缓冲区中的值不仅可以作为一个独立的整体使用,还可以作为一个比特集合使用。

缓冲内存 Buffer Memory

       这里用一个简单的计算的例子来说明。

       假如屏幕在真色彩模式下显示一个1280*1024的图像,每个颜色通道用8位来表示,RGBA,一共四个字节,那么现实整个图片需要的空间是1280*1024*4 = 5MB。使用双缓冲技术,则空间翻倍10MB,再用24位的深度缓冲,8位的模板缓冲区,现在占用的空间是15MB, 如果还要用到一些抗锯齿的处理,比如说超级采样(SuperSampling)或者多重采样(multiSampling),需要的存储空间会更多。


from:http://blog.csdn.net/silangquan/article/details/17493167

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题同样需要分几个步骤来回答: 1. 创建一个 YUV 格式的输入缓冲区,并将原始图像数据拷贝到缓冲区。 ```cpp uint8_t* inputBuffer; int inputBufferSize; int inputBufferIndex = AMediaCodec_dequeueInputBuffer(encoder, -1); AMediaCodecBufferInfo inputBufferInfo = {}; uint8_t* inputBufferPtr = AMediaCodec_getInputBuffer(encoder, inputBufferIndex, &inputBufferSize); memcpy(inputBufferPtr, yuvData, yuvDataSize); AMediaCodec_queueInputBuffer(encoder, inputBufferIndex, 0, inputBufferSize, presentationTimeUs, 0); ``` 2. 等待编码器输出一个 MP4 格式的输出缓冲区,并将缓冲区的数据写入到文件。 ```cpp int outputBufferIndex = AMediaCodec_dequeueOutputBuffer(encoder, &outputBufferInfo, -1); if (outputBufferIndex >= 0) { uint8_t* outputBufferPtr = AMediaCodec_getOutputBuffer(encoder, outputBufferIndex, &outputBufferSize); fwrite(outputBufferPtr, 1, outputBufferSize, outputFile); AMediaCodec_releaseOutputBuffer(encoder, outputBufferIndex, false); } ``` 3. 处理编码器的状态和错误信息。 ```cpp int status = AMediaCodec_infoOutputStatus(encoder, outputBufferIndex); if (status == AMEDIACODEC_INFO_OUTPUT_FORMAT_CHANGED) { AMediaFormat* outputFormat = NULL; outputFormat = AMediaCodec_getOutputFormat(encoder); // Write the output format to the file, e.g. as an MP4 header. } else if (status == AMEDIACODEC_INFO_TRY_AGAIN_LATER) { // Wait for the next input buffer or output buffer. } else if (status == AMEDIACODEC_INFO_OUTPUT_BUFFERS_CHANGED) { // Update the output buffer indices and pointers. } ``` 需要注意的是,这个过程需要处理各种错误和异常情况,例如编码器的状态和错误码,输入和输出数据的格式不匹配,等等。此外,还需要管理输入和输出数据的缓冲区,以及处理多个音视频轨道的情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值