GLFW介绍

GLFW介绍,第1张

3D图形加速卡术语大全

Anti-aliasing (反锯齿处理)

简单地说主要是应用调色技术将图形边缘的“锯齿”缓和,边缘更平滑。反锯齿是相对来来说较复杂的技术,一直是高档加速卡的一个主要特征。目前的3D加速卡大多不支持反锯齿,但在下一代3D加速卡如RIVA TNT、G200中将支持这项技术。

Alpha Blending ( Alpha 值混合处理)

Alpha Blending是一种使物体透明化的技术。通常当一个3D物体在屏幕上显现时,其每个象素都会有红黄蓝三个数值进行控制。如果当前的3D环境能够提供一组额外的alpha值,那么我们就称它拥有一个alpha channel。Alpha的内容是记录象素的透明度。比如说在水中水中游泳的劳拉,水和人各有不同的Alpha 值(水的alpha较低),当劳拉跳入水中后,如果当前硬件环境支持alpha混合,那么当两者结合时就会将alpha值进行运算。最终我们看到的是两者在重叠部分会得到模糊化处理的效果。由于alpha值的介入,使得我们在游戏中采能够得到接近现实的虚拟透明效果。

加速图形端口(AGP):

一种可自由扩展的图形总线结构,能增大图形控制器的可用带宽,并为图形控制器提供必要的性能,以便在系统内存里直接进行纹理处理。这是一种新的接口标准,在物理结构上与PCI存在显著区别,专为图形控制器设计。它同时使用了卡上帧缓冲内存与系统内存。

深度效果处理(Depth Cueing) :

根据离观察者的距离,改变物件的颜色强度和亮度。例如,即使一个闪亮、鲜艳的红球,如果越来越远离观察者,也会变得越来越阴暗。

雾化效果(Fogging) :

雾化效果是3D的比较常见的特性,在游戏中见到的烟雾、爆炸火焰以及白云等效果都是雾化的结果。它的功能就是制造一块指定的区域笼罩在一股烟雾弥漫之中的效果,这样可以保证远景的真实性,而且也减小了3D图形的渲染工作量。

Texture Mapping (材质贴图):

是在物体着色方面最引人注意、也是最拟真的方法,同时也多为目前的游戏软件所采用。一张平面图像(可以是数字化图像、小图标或点阵位图)会被贴到多边形上。例如,在赛车游戏的开发上,可用这项技术来绘制轮胎胎面及车体着装。

Mip Mapping (Mip贴图):

这项材质贴图的技术,是依据不同精度的要求,而使用不同版本的材质图样进行贴图。例如:当物体移近使用者时,程序会在物体表面贴上较精细、清晰度较高的材质图案,于是让物体呈现出更高层、更加真实的效果;而当物体远离使用者时,程序就会贴上较单纯、清晰度较低的材质图样,进而提升图形处理的整体效率。

Bump Mapping (凹凸贴图):

这是一种在3D场景中模拟粗糙外表面的技术。将深度的变化保存到一张贴图中,然后再对3D模型进行标准的混合贴图处理,即可得到具有凹凸感的表面效果。

Video Texture Mapping ( 视频材质贴图):

这是目前最好的材质贴图效果。具有此种功能的图形图像加速卡,采用高速的图像处理方式,将一段连续的图像(可能是即时运算或来自一个AVI或MPEC的档案)以材质的方法处理,然后贴到3D物件的表面上去。

双线MIP贴图(Bilinear MIP Mapping) :

双线过滤和MIP贴图的一种组合形式。首先保存好一张纹理贴图的几个副本。接着,选中最接近选择的贴图。最后,求选中贴图最接近的四个质素的加权平均值。

双线过滤/插补(Bilinear Filtering/Interpolation) :

这是一种较好的材质影像插补的处理方式,会先找出最接近像素的四个图素,然后在它们之间作差补效果,最后产生的结果才会被贴到像素的位置上,这样不会看到“马赛克”现象。这种处理方式较适用于有一定景深的静态影像,不过无法提供最佳品质,也不适用于移动中的物件。画面由于采用了“双线过滤”,图像显得非常“柔和”。

Nearest Neighbor (近邻取样)

是一种较简单材质影像插补的处理方式。会使用包含像素最多部分的图素来贴图。换句话说就是哪一个图素占到最多的像素,就用那个图素来贴图。这种处理方式因为速度比较快,常被用于早期3D游戏开发,不过材质的品质较差。

Trilinear Interpolation (三线过滤处理):

这是一种更复杂材质影像插补处理方式,会用到相当多的材质影像,而每张的大小恰好会是另一张的四分之一。例如有一张材质影像是512×512个图素,第二张就会是256×256个图素,第三张就会是128×128个图素等等,总之最小的一张是1×1。凭借这些多重解析度的材质影像,当遇到景深极大的场景时(如飞行模拟),就能提供高品质的贴图效果。一个“双线过滤”需要三次混合,而“三线过滤”就得作七次混合处理,所以每个像素就需要多用21/3倍以上的计算时间。还需要两倍大的存储器时钟带宽。但是“三线过滤”可以提供最高的贴图品质,会去除材质的“闪烁”效果。对于需要动态物体或景深很大的场景应用方面而言,只有“三线过滤”才能提供可接受的材质品质。

Perspective Correction (透视角修正处理)

它是采用数学运算的方式,以确保贴在物件上的部分影像图,会向透视的消失方向贴出正确的收敛。在图3中,当图形画面向前倾斜时,左边的画面由于采用了“透视角修正”技术,画面上的直线保持真实的透视效果;而右边的画面没有采用“透视角修正”技术,因而画面上的直线出现了失真。

Z Buffer (Z 缓存)

Z-buffering是在为物件进行着色时,执行“隐藏面消除”工作的一项技术,所以隐藏物件背后的部分就不会被显示出来。

在3D环境中每个像素中会利用一组数据资料来定义像素在显示时的纵深度(即Z轴座标值)。Z Buffer所用的位数越高,则代表该显示卡所提供的物件纵深感也越精确。目前的3D加速卡一般都可支持16位的Z Buffer,新推出的一些高级的卡已经可支持到32位的Z Buffer。对一个含有很多物体连接的较复杂3D模型而言,能拥有较多的位数来表现深度感是相当重要的事情。

Double Buffering (双重缓冲区处理)

绝大多数可支持OpenGl的3D加速卡都会提供两组图形画面信息。这两组图形画面信息通常被看着“前台缓存”和“后台缓存”。显示卡用“前台缓存”存放正在显示的这格画面,而同时下一格画面已经在“后台缓存”待命。然后显示卡会将两个缓存互换,“后台缓存”的画面会显示出来,且同时再于“前台缓存”中画好下一格待命,如此形成一种互补的工作方式不断地进行,以很快的速度对画面的改变做出反应。

RAMDAC(存储器数模转换速度)

表示将存储器图形数据转换成显示器上可见的像素光点的转换速度,单位为MHz,其工作速度越高,频带越宽,高分辨时的画面质量越好。

高洛德上色(Gouraud Shading) :

一种光影渲染技术。它将照明模型应用于一个多边形的每个顶点,然后在整个表面铺开。结果便是一个平滑渐变的表面。

图形函数库(Graphics Library) :

图形处理函数与子例程的一个集合,程序员可用它作为接口,方便地调用低级任务。

锯齿(Jaggies) :图像的锯齿效果,由映射失真造成。

照明模型(Lighting Model) :一种图形处理公式,用于模拟灯光照射到物件表面的效果。

三元荧(Phosphor triad) :构成一个像素的三个荧光体,分别能发出红光、绿光或蓝光。

像素(Pixel) :Picture Element(图形元素)的简称,屏幕颜色与强度的一个单位。像素其实是能够定址和分配颜色值的最小单位。

光栅(Raster) :由像素构成的一个矩形网格。要在光栅上显示的数据保存于帧缓存内。

3D API

API是Application Programming Interface应用程序接口的缩写,是许多程序的大集合。一个3D API能让编程人员所设计的3D软件只要调用其API内的程序,从而让API自动和硬件的驱动程序沟通,启动3D芯片内强大的3D图形处理功能,从而大幅度地提高了3D程序的设计效率。目前普遍应用的3D API有DirectX、OpenGL、Glide、Heidi。

·DirectX

微软公司专为PC游戏开发的API,与Windows 95 和Windows NT *** 作系统兼容性好,可绕过图形显示接口(GDI)直接进行支持该API的各种硬件的底层 *** 作,大大提高了游戏的运行速度,而且目前基本上是免费使用的。由于要考虑与各方面的兼容性,DirectX用起来比较麻烦、在执行效率上也未见得最优。具体组成及功能详情可参看本报第33期(8月31日)“Microsoft DirectX 60演武传奇”一文。

·OpenGL (开放式图形接口)

由Silicon Graphics公司开发,能够在Windows 95、Windows NT、Macos、Beos、OS/2、以及Unix上应用的API。由于OpenGL起步较早,一直用于高档图形工作站,其3D图形功能很强,超过

DirectX,能最大限度地发挥3D芯片的巨大潜力。在Windows 98中已经支持Direct X和OpenGL。在OpenGL的12版中增加了对3DNow!标准的支持。

·Glide

这是3Dfx公司为VOODOO系列3D加速卡设计的专用3D API,它可以最大限度发挥VOODOO系列芯片的3D图形处理功能,由于不考虑兼容性,其工作效率远比OpenGL和Direct 3D高,所以Glide是各3D游戏开发商优先选用的3D API。不过,这样一来就使得许多精美的3D游戏在刚推出时,只支持3Dfx公司的VOODOO系列3D加速卡,而其它类型的3D加速卡则要等待其生产厂商提供该游戏的补丁程序。

·Heidi

Heidi是一个由Autodesk公司提出来的规格。目前,采用Heidi系统的应用程序包括3D Studio MAX动画制作程序、Autodesk公司为 AutoCAD R13开发的WHIP加速驱动程序。

--------------------------------------------------------------------------------

Layer收到onFrameAvaliable通知后,会通知SurfaceFlinger更新,重新进行图像合成

在SurfaceFlinger重新合成图像的过程中,会遍历所有发生变化的Layer,此时调用Layer的latchBuffer函数去BufferQueue中拿方才生产者入队的Buffer进行处理

latchBuffer比较长, 主要作用分析是否需要重新计算当前Layer的visibleRegion

接着看下updateTextureImage方法

updateTextureImage函数主要包含个流程

1:acquireBufferLocked从BufferQueue中获取Buffer,拿到Buffer后,将Buffer保存在mSlots[item->mSlot]mGraphicBuffer中。

2:调用参数传入的Rejecter对象。来判断图像缓冲区Buffer是否符合条件。

3:调用updateAndReleaseLocked函数更新Buffer,并且释放掉上一个Buffer

SurfaceFlingerConsumer的acquireBufferLocked直接调用了父类的acquireBufferLocked函数。

GLConsumer的acquireBufferLocked函数也比较简单,调用父类ConsumerBase的acquireBufferLocked函数获取新的Buffer,然后根据获取的新GraphicBuffer创建一个EglImage,保存在GLConsumer的数组mEglSlots中。

GLConsumer维护了一个数组mEglSlots,和前面讲的mSlots类似,将EglImage对象保存在数组对应的slot位置上

同理GLConsumer的acquireBufferLocked也是直接调用BufferQueueConsumer的方法。

BufferQueueConsumer的acquiredBuffer函数从BufferQueue中拿准备好的Buffer数据。

1:先统计消费者acquire的buffer的数量是否查过最大限度,超过的话则禁止获取

2:遍历mQueue队列,获取合适的Buffer。如果Queue中等待显示的Buffer数量大于1,需要查看队列后边是否有指定显示时间且显示时间已经到的Buffer,有到话则直接放弃前边一个,显示后一个。循环处理,直到找到最紧急显示到Buffer。

3:根据找到的Buffer判断该Buffer是有需要立刻显示,如果离指定显示时间大于一定时间,则发挥PRESENT_LATER,此次显示不再处理该Buffer。

4:拿到需要显示的Buffer,设置需要显示Buffer的状态为ACQUIRED,并且将它从mQueue等待对了移除。

5:如果有遗弃的Buffer,需要同时有Buffer释放。

分析到这里Buffer已经从BufferQueue队列获取到了,下一步看如何更新Buffer。

updateAndRelease方法从名称就可看出其 *** 作内容。更新新Buffer,释放旧Buffer。

每一个Layer都和一个Surface对应, Surface在App端,是 *** 作和填充当前窗口的接口,而Layer则在SurfaceFlinger端来描述这个窗口。Layer在创建的时候会创建一个纹理Texture,这个Texture id也保存在了SurfaceFlingerConsumer中。SurfaceFlinger绘制的时候遍历Layer,Layer又会调用自己的SurfaceFlingerConsumer将合适的Buffer更新到纹理中。

SufaceFlinger更新纹理,上一步介绍了如果从BufferQueue中获取Buffer这一步介绍,如何更新到纹理。

1:首先做判断,是否attach到EGLContext,没有Attach则直接释放当前Buffer。普通Layer默认是Attach到SurfaceFlinger主线程的EGLContext上的。(需要attach的SurfaceView)

2:检查EGL状态和上次是否发生了变化

3:每个slot中的GraphicBuffer都会创建一个EGLImage,保存在GLConsumer的mEglSlots数组中。

4:释放掉旧的buffer

5:保存新的Buffer信息到GLConsumer信息中,等待将Buffer数据填充到openGL纹理中

上面的步骤已经把Buffer从Buffer队列获取到了,也已经将Buffer更新到GLConsumer中,同时也释放掉了旧的Buffer,但是何时填充纹理进行绘制呢?

也是在SurfaceFlinger进行图形合成的过程中,先执行了latchBuffer来更新纹理,后边后依次执行Layer的onDraw方法,进行绘制,Layer的onDraw方法会调用SurfaceFlingerConsumer的bindTextureImage来绑定并填充纹理。

这个步骤将纹理绑定到了EGLContext, 然后调用了glEGLImageTargetTexture2DOES(texTarget,static_cast<GLeglImageOES>(mEglImage));将Buffer内容填充到了纹理中。这样纹理也准备好了,就等SurfaceFlinger进行合成了。

一个GraphicBuffer缓冲区如何从Producer传递到Consumer,以及Consumer接收到之后如何处理已经分析完成了。过程比较长,做一下简单的总结。

以上就是关于GLFW介绍全部的内容,包括:GLFW介绍、关于cs的所有指令、急~急~急~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9313123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存