`
wsqwsq000
  • 浏览: 689954 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

OpenGL中的帧缓存

 
阅读更多

 

 

(本文参考的是《OpenGL编程权威指南》,也就是传说中的“红宝书”)
一、缓存的分类
1. 颜色缓存
    指程序员绘图所用的缓存,分为:
     左、右缓存——用于立体感视图(必须要有左缓存);
     前、后缓存——用于双缓存(必须要有前缓存);
     4个辅助缓存——可选择的、不可显示(程序员可以自己定义和使用它们)。
2. 深度缓存
    用来存储每个象素的深度值,也称为Z缓存。
3. 模板缓存
    可以将作图限制在屏幕的某些部分中进行。
4.累积缓存
   包含RGBA颜色数据,通常用于将一系列图象累加成一幅最终的合成图象。
    象素不能直接绘制到累积缓存中,累加操作常常先在矩形块中进行,然后再与颜色缓存交换数据。
二、缓存的操作
1. 清空缓存
    (1). 指定要写入缓存的清除值:
           glClearColor()——为颜色缓存设置清除值(red,green,blue,alpha);
           glClearIndex()——为颜色索引缓存设置清除值(index);
           glClearDepth()——为深度缓存设置清除值(默认为1.0);
           glClearStencil()——为模板缓存设置清除值(默认为0.0);
           glClearAccum()——为累积缓存设置清除值(red,green,blue,alpha);
    (2). 清除指定的缓存:
           glClear(GLbitfield mask);
           mask的值是GL_COLOR_BUFFER_BIT、GL_DEPTH_BUFFER_BIT、GL_STENCIL_BUFFER_BIT和GL_ACCUM_BUFFER_BIT等常数的按位逻辑或(OR)。可以一次清除多个缓存,如硬件支持同时清除这些缓存,则操作同时进行;否则,按顺序清除各个缓存。
2. 为读写操作选择颜色缓存
    绘图操作的结果可以放入任何一个颜色缓存中:前、后、左前、左后、右前、右后或任意辅存,程序员可选择单个缓存作为绘图目标或读取目标。对绘制图形而言,也可将目标同时绘制到几个缓存中,用glDrawBuffer()函数来选择将要写入的缓存;用glReadBuffer()函数来选择缓存,作为glReadPixels()、glCopyPixels()、glCopyTexImage*()和glCopyTexSubImage*()的应用目标。
3. 缓存的屏蔽(掩码)
    OpenGL在向激活的颜色、深度和模板缓存中写入数据之前,需按下面函数指定的掩码对这些数据进行屏蔽操作。每个掩码要与对应的待写数据进行按位逻辑与(AND)操作。
    void glIndexMask(GLuint mask);
        mask默认为1。若掩码中出现1,则颜色索引模式中相应的位被写入;而在0出现的位,则不写。    
    void glColorMask(GLboolean red,green,blue,alpha);
        默认为GL_TRUE,表示相应的分量已写入;若为GL_FALSE,则没写入。
    void glDepthMask(GLboolean flag);
        默认为GL_TRUE,表示深度缓存被激活用于写操作;若为GL_FALSE,则取消。
    void glStencilMask(GLuint mask);
        默认为1,和颜色索引类似。
二、片元的测试和操作
    在OpenGL确定了应该生成的片元及绘制颜色后,仍然需要几个处理过程来控制如何将该片元作为一个象素绘制到帧缓存中,以及确定是否需要这样做。本节描述了在放入帧缓存之前,片元所必须通过的完整测试集合,并且描述了在片元写入时可能进行的最后操作。测试和操作按下列次序进行,若在前面的测试中片元被删除,则不再进行后面的测试或操作。
    ·剪取测试
    ·alpha测试
    ·模板测试
    ·深度测试
    ·混合
    ·抖动
    ·逻辑操作
1 .剪取测试
    剪取测试只是使用屏幕矩形区域进行的模板测试的翻版,但是由于很容易用硬件快速实现,所以比以软件方式执行的模板要快。
    利用glScissor()函数,可以定义窗口中的一个矩形区域,并将作图限制在其中。若片元落在该矩形区,则剪取测试通过,否则片元被删除。
    void glScissor(GLint x,GLint y,GLsizei width,GLsizei height);
    glEnable(GL_SCISSOR_TEST):激活剪取测试;
    glDisable(GL_SCISSOR_TEST):取消剪取测试。
    默认情况下,矩形与窗口的大小相同,剪取处于取消状态。
2. alpha测试
    在RGBA模式下,根据alpha测试中的alpha值,来确定是接收还是拒绝一个片元。
    glEnable/glDisable(GL_DEPTH_TEST):激活/取消alpha测试
    glAlphaFunc设置alpha测试的参考值和比较函数:
    void glAlphaFunc(GLenum func,GLclampf ref);
    参考值ref取值在0和1之间截取。参数func的可能值及其含义如下:
    GL_NEVER:总不接受该片元;GL_ALWAYS:总是接受该片元;
    GL_LESS:若片元alpha<参考alpha ,接受该片元;GL_LEQUAL:片元alpha≤参考alpha,接受;
    GL_EQUAL:片元alpha=参考alpha,接受;GL_GEQUAL:片元alpha≥参考alpha,接受;
    GL_GREATER:片元alpha>参考alpha,接受;GL_NOTEQUAL:片元alpha≠参考alpha,接受;
3. 模板测试
    只在有模板缓存的情况下才会发生。如果没有模板缓存,则模板测试总能通过。模板化适用于这样的测试,这种测试对存储于模板缓存中的象素值与参考值进行比较,根据比较的结果,对模板缓存中的值进行修改。
    void glStencilFunc(GLenum func,GLint ref,GLuint mask);
    此函数为模板测试设置比较函数(func)、参考值(ref)以及掩码(mask)。利用比较函数可以对参考值和模板缓存中的值进行比较,而比较仅适用于掩码的相应位为1的位。比较函数的可能值与glAlphaFunc()中的比较函数的可能值相同,但含义相反。
    void gltencilOp(GLenum fail,GLenum zfail,GLenum zpass);
    此函数说明当片元通过或未通过模板测试时,如何对模板缓存中的数据进行修正。三个参数fail、zfail、zpass可以为:
    GL_KEEP:保持当前值
    GL_ZERO:以0替换
    GL_REPLACE:以参考值替换
    GL_INCR:增加该值(在0~最大无符号整数值之间)
    GL_DECR:减小该值(在0~最大无符号整数值之间)
    GL_INVERT:对该值按位取反
    若片元未通过模板测试,则应用fail函数;
    若片元通过模板测试,但深度测试失败,则应用zfail函数;
    若片元通过模板测试,且通过深度测试,或没有深度测试,则应用zpass函数。
    默认情况下,三个模板操作都是GL_KEEP。
    模板测试最典型的应用就是屏蔽掉屏幕的不规则区域,以避免在该区域作图。
4. 深度测试
    对于屏幕上的每个象素,深度缓存时刻追踪视点与占据该象素的物体之间的距离。若通过了深度测试,输入的深度值就将取代深度缓存中的相应值。
    深度缓存通常用于消除隐藏表面的操作。最初,深度缓存通常是以距离视点尽可能远的值来填充的,因此任何物体的深度都比初始状态更近。
    glEnalbe(GL_DEPTH_TEST);//激活深度测试
    glClearDepth(1.0);//清除深度缓存
    可以用glDepthunc()函数为深度测试选择不同的比较函数。
    void glDepthFunc(GLenum func);
    此函数为深度测试设置比较函数。func的值必须为GL_NEVER、GL_ALWAYS、GL_LESS、GL_LEQUAL、GL_EQUAL、GL_GEQUAL、GL_GREATER或GL_NOTEQUAL。如果z值与深度缓存中的值满足确定的关系,则输入片元通过深度测试。
5. 混合、抖动和逻辑操作
    一旦输入的片元通过了所有的测试,它就可以与颜色缓存中的当前内容按某种方式合并起来。最简单的方法,也是默认操作,就是将当前值覆盖掉。
    在RGBA模式中,如果希望片元是半透明的或是消除了锯齿现象的,程序员可以将该片元值与缓存中的值作一平均,即混合。
    对于可用颜色较少的系统,可以以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量。抖动操作是和硬件相关的,OpenGL允许程序员所做的操作就只有打开或关闭抖动操作。实际上,若机器的分辨率已经相当高,激活抖动操作根本就没有任何意义。要激活或取消抖动,可以用glEnable(GL_DITHER)和glDisable(GL_DITHER)函数。默认情况下,抖动是激活的。
    在颜色索引模式中,可以利用任意的按位逻辑操作,将输入片元与已写入的象素进行合成。

注:详细内容请参考《The Office Guide to Learning OpenGL》(Red Book)

 

 

分享到:
评论

相关推荐

    OPENGL将帧缓存数据保存为位图

    /* **presented by lxxgreat **说明: **GLubyte *bits;//定义指向位图数据的指针 **bits = (unsigned char *)...//从帧缓存中读取位图数据 **Snapshot( ( BYTE*)bits,Width,Height, "test.bmp");// 生成24位BMP图片 */

    一个从帧缓存中读取像素的例子

    在这个例子中,我们关注的是如何利用OpenGL从帧缓存中读取像素数据,这对于图像处理、屏幕截图、或者进行像素级别的图像分析等任务非常有用。帧缓存是OpenGL中的一个重要组成部分,它存储了待显示的像素数据,是GPU...

    OpenGL编程指南.pdf

    本文档为 OpenGL 编程指南,涵盖了 OpenGL 的基础知识、概念、基本程序结构、数据类型、函数名、辅助库、模型建立、变换、颜色、光照、位图和图像、纹理、复杂物体建模、特殊光处理、效果处理、显示列表、帧缓存和...

    OpenGL 放大镜

    2. 渲染整个场景到帧缓存中。 3. 解绑帧缓存,恢复默认的帧缓冲区,然后设置裁剪矩形或圆形,定义放大镜的区域。 4. 使用FBO的纹理作为源,在裁剪区域内进行放大渲染。这通常通过修改纹理坐标或者使用纹理过滤器来...

    OpenGL ES 2.0规范(中文版)——本人自己翻译总结的

    - **帧缓存**:OpenGL ES 2.0提供了两种帧缓存:窗口系统提供的帧缓存和应用程序创建的帧缓存。前者由窗口系统管理,后者则由应用程序根据需要创建和销毁。 - **帧缓存的区别**:OpenGLES命令对window-system-...

    OpenGL ES简单应用

    在每一帧的渲染过程中,所有图形操作的结果都会被累积到帧缓存中。帧缓存可以包含颜色缓冲区、深度缓冲区和模板缓冲区,它们分别用于存储颜色信息、景深信息和模板信息,以实现复杂的图像效果,如阴影、透明度和...

    并行帧缓存设备:基于多核CPU的Xorg并行显示优化.pdf

    4. **缓存一致性**:在多核系统中,每个核心都有自己的缓存,确保缓存数据的一致性是并行帧缓存设备必须解决的问题。一种常见的解决方案是采用MESI协议(Modified, Exclusive, Shared, Invalid),维护缓存的正确...

    OpenGL.rar

    本书详细介绍了OpenGL4.5(包括4.4、SPIR—V和扩展...第11章介绍使用OpenGL帧缓存和缓存内存实现高级渲染技术和非图形学应用的相关方法;第12章介绍了新的着色器阶段,将通用计算的方法融合到OpenGL的渲染流水线当中。

    OpenGL基础图形编程

    总目录  第一章 OpenGL与三维图形世界  1.1 OpenGL使人们进入三维图形世界  1.2 OpenGL提供直观的三维图形开发... 第十七章 OpenGL帧缓存和动画  17.1 帧缓存  17.1.1 帧缓存组成  17.1.2 缓存清除  17.2 动画

    论文研究-基于OpenGL驱动的三维场景重构.pdf

    基于OpenGL环境,提出利用场景渲染结果即帧缓存数据(主要包括颜色缓存及深度缓存)进行局部三维场景重构的方法。根据投影变换原理和深度缓存特点研究了逆投影变换,得到了三维点元的重构方法。在此基础上,利用帧...

    opengl函数大全

    OpenGL 的像素操作函数提供了许多函数来处理像素的操作,包括指定光栅位置、绘制位图、从帧缓存中读取像素、将像素写人帧缓存等。 * glRasterPos:为像素操作指定光栅位置 * glBitmap:绘制位图 * glReadPixels:从...

    OpenGL编程指南(第四版) 中文版 pdf

    然后深入探讨一些高级技术 包括反走样 雾阄 显示列表 图像处理 纹理映射 帧缓存 网格化 NURBS 选择和反馈等;同时讨论其他一些重要主题 像如何提高程序的性能 OpenGL扩展和跨平台技术等 本书只要求读者有一定的...

    基于opengl es 的显示gif的例子

    2. **帧缓存管理**:GIF由多帧组成,每帧可能有自己的局部颜色表。你需要为每一帧分配缓冲区,用于存储每个帧的像素数据。同时,为了实现动画效果,需要管理帧的显示顺序和时间间隔。 3. **纹理映射**:OpenGL ES...

    基于OpenGL的三维曲面数据场动态显示.docx

    OpenGL是一个独立于操作系统的开放式三维图形软件接口,其主要功能是将三维曲面通过顶点序列或像素点进行描述,并进行相应的透视、光照、纹理操作,最终转换成帧缓存中的图像数据,利用该图像数据进行三维曲面图形的...

    OpenGL超级宝典中文第三版

    它提供了各种功能,包括建模、变换、光照、纹理映射、帧缓存操作等。 《OpenGL超级宝典中文第三版》可能涵盖了以下知识点: 1. OpenGL基础概念和历史背景:介绍OpenGL的发展历程、它的跨平台特性以及核心概念,如...

    opengl es API解析

    - OpenGLES命令对窗口系统提供的帧缓存的影响由窗口系统本身控制,而OpenGLES本身不包含配置窗口系统提供的帧缓存的命令。例如,CRT监视器或LCD面板不能被OpenGLES直接访问。 5. **学习和研究OpenGL ES 2.0**: -...

    teapots.rar

    每个茶壶的渲染结果都会被存储到帧缓存中。 最后,为了实现叠加效果,我们还需要确保帧缓存的颜色数据正确地被绘制到屏幕上。这通常涉及混合模式的设置,例如,我们可以开启颜色混合并设置适当的混合函数: ```cpp...

    OpenGL编程指南(第四版)(PDF)+源码

    然后深入探讨一些高级技术,包括反走样、混合、雾效、显示列表、图像处理、纹理映射、帧缓存、网格化、NURBS、选择和反馈等;同时讨论其他一些重要主题,像如何提高程序的性能、OpenGL扩展和跨平台技术等。本书只...

    opengl纹理映射(下)

    开发者可以从内存中的纹理数据直接定义纹理,也可以从帧缓存中读取数据,将其应用到纹理中。这为动态纹理的更新和使用提供了很大的灵活性。 使用内存数据替换纹理图像和使用帧缓存数据替换纹理图像是两种不同的纹理...

    OpenGL ES 纹理实例

    OpenGL ES 3.0引入了更多的特性,如浮点纹理支持、帧缓冲对象(FBOs)和顶点数组对象(VAOs),使得处理纹理和其他图形元素变得更加高效和灵活。 在实际开发中,你可能需要考虑纹理压缩,以减少内存占用和提高性能...

Global site tag (gtag.js) - Google Analytics