介绍---Frame Buffer

本文探讨了OGL输出的不同模式及其对onscreenbuffer的影响,包括直接修改、通过blit技术间接更新及全屏更新方式。同时介绍了fragment的概念及其包含的信息,并详细解释了colorbuffer、depthbuffer与stencilbuffer的作用,最后讨论了framebuffer与窗口的关系。

实际上,OGL的输出并不一定直接修改on screen buffer。有三种可能情况:

1. 下图中的bufer就是on screen buffer,或者是on screen buffer的一部分,此时,OGL的输出直接修改on screen buffer的内容。

【扩展】当应用程序以front buffer作为draw buffer,或者选择single buffer时,是这样的情况,但是屏幕很有可能会出现闪烁现象。

2. buffer是独立于on screen buffer的存在,OGL首先输出到buffer中,然后再在适当的时候,将buffer中的数据拷贝到on screen buffer中。buffer的大小可以和on screen buffer相同,也可以小于on screen buffer。

【扩展】这种方法被称为blit

3. buffer是独立于on screen buffer的存在,而且两者的大小是相同的,也就是说,这是一个全屏的程序,OGL首先输出到buffer中,然后再在适当的时候,将这块buffer当做on screen buffer交给Display Controller输出到显示设备中。

xxx

 实际上,OGL的输出除了影响on screen buffer外,还有一些其他输出。在此之前,我们先来了解Fragment的概念。

我们知道,显示器是由像素pixel组成的,每个像素都有其颜色color信息;OGL的输出由fragment组成,其和pixel在位置上是一一对应的。每个fragment不仅有color信息,也有诸如depth、stencil等信息,这些信息被输出到不同的buffer中。上图描述的是fragment的color信息,其中的buffer即color buffer。

【说明】depth、stencil的意义将在以后解释。

接收color信息的buffer被称为color buffer,接收depth信息的buffer被称为为depth buffer,接收stencil信息的buffer被称为stencil buffer。根据配置不同,可能不存在depth buffer和stencil buffer,如果存在的话,则只有一份。而color buffer则有多份,比如front color buffer、back color buffer等,OGL可以将结果输出到合适的color buffer中,再在合适的时机反映到on screen buffer进行显示。所有的这些buffer组合,被称为frame buffer。

4

Frame Buffer是和窗口绑在一起的,也就是说,只有在用Win32 API(Win系统)或者X函数(Linux/X系统)创建一个窗口后,然后才因而衍生出Frame Buffer;而用OGL在窗口绘制的本质,就是将OGL的结果输出到窗口相关的Frame Buffer中后显示。

【扩展】在2008年提出的frame buffer object技术取消了frame buffer必须依赖窗口的限制,也就是说,OpenGL Spec扩展了对Frame Buffer的支持,不需要基于窗口即可创建出frame buffer,但是,这个frame buffer是off screen的,是无法被显示出来的,所以,一般可以作为中间计算结果。如果要想最终的显示,必须先创建一个窗口,然后改变该窗口所衍生的frame buffer中的数据。

### Z - Buffer原理 Z - Buffer(深度缓冲)是一种用于处理三维场景中物体遮挡关系的技术。在三维场景渲染时,每个像素除了有颜色信息外,还有一个深度值(Z值),Z值表示该像素对应的物体表面到相机的距离。当渲染一个新的像素时,会将该像素的Z值与Z - Buffer中存储的当前像素的Z值进行比较。如果新像素的Z值小于Z - Buffer中的值,说明新像素离相机更近,就更新该像素的颜色和Z - Buffer中的Z值;反之,则忽略该新像素。 ### Z - Buffer应用 - **游戏开发**:在3D游戏中,使用Z - Buffer可以正确处理场景中物体的遮挡关系,使得离相机近的物体能够遮挡住离相机远的物体,从而呈现出真实的三维效果。 - **动画制作**:在制作三维动画时,确保不同物体之间的正确遮挡,让画面更加真实自然。 ### Z - Order原理 Z - Order是一种用于确定二维或三维场景中对象绘制顺序的方法。它给每个对象分配一个Z值(通常是一个整数),这个Z值表示对象在Z轴上的顺序。渲染时,按照Z值从小到大的顺序依次绘制对象,Z值小的对象先绘制,Z值大的对象后绘制,后绘制的对象会覆盖先绘制的对象。 ### Z - Order应用 - **图形用户界面(GUI)开发**:在GUI中,窗口、按钮等元素有不同的层级关系。通过Z - Order可以确定哪个元素在上面显示,哪个元素在下面显示,例如弹出窗口需要显示在普通窗口之上。 - **2D游戏开发**:在2D游戏中,不同的游戏元素(如角色、背景、道具等)有不同的层叠关系,使用Z - Order可以控制它们的显示顺序,如前景物体覆盖背景物体。 ### Z - Buffer和Z - Order区别 - **实现层面**:Z - Buffer是在像素级别进行深度比较和更新,是一种基于硬件的实现方式,通常由图形处理器(GPU)完成;而Z - Order是在对象级别确定绘制顺序,是一种基于软件的算法。 - **精确性**:Z - Buffer可以实现非常精确的遮挡处理,能够处理复杂的三维物体之间的遮挡关系;Z - Order主要用于处理简单的层叠关系,对于复杂的三维场景,无法精确处理物体之间的遮挡。 - **性能**:Z - Buffer在处理大量像素时性能较好,因为它是硬件加速的;Z - Order在处理少量对象时性能较好,但当对象数量较多时,排序和绘制的开销会增加。 ### 代码示例(伪代码) #### Z - Buffer伪代码 ```python # 初始化Z - Buffer z_buffer = [float('inf')] * (width * height) # 渲染每个物体 for object in objects: for pixel in object.pixels: x, y, z = pixel index = y * width + x if z < z_buffer[index]: z_buffer[index] = z frame_buffer[index] = pixel.color ``` #### Z - Order伪代码 ```python # 按照Z值对对象排序 sorted_objects = sorted(objects, key=lambda obj: obj.z_order) # 依次绘制对象 for object in sorted_objects: draw(object) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值