首页 > 其他分享 >OpenGL中的Frame Buffer、Depth Buffer、Color Buffer、Stencil Buffer

OpenGL中的Frame Buffer、Depth Buffer、Color Buffer、Stencil Buffer

时间:2024-02-01 16:13:16浏览次数:32  
标签:Stencil OpenGL Buffer 像素 深度 缓冲区

Frame Buffer

Frame Buffer: 是一块buffer(即内存),存储了一帧的buffer数据。

从数据结构的角度来看,此处的Frame Buffer并不是一个真正意义上的buffer,其存了一些指针,分别指向Depth Buffer、Color Buffer、Stencil Buffer、Texture、RBO(Render Buffer Object)等。

Wiki中的解释:https://www.khronos.org/opengl/wiki/Framebuffer_Object

 

Depth Buffer

Depth Buffer:深度缓存区。

工作原理如下:

  1. 在图形渲染过程中,对于每个像素,渲染管线会计算出其在观察空间中的深度值。
  2. 当一个像素需要进行渲染时,会将其深度值与深度缓冲区中对应像素的深度值进行比较。
  3. 如果当前像素的深度值小于深度缓冲区中的深度值,说明当前像素位于前面,它将被认为是可见的,并将其深度值写入深度缓冲区。
  4. 如果当前像素的深度值大于深度缓冲区中的深度值,说明当前像素被前面的物体遮挡,它将被认为是不可见的,深度缓冲区中的深度值不做更新。

深度缓冲区的主要作用是进行深度测试(Depth Test),即通过比较像素的深度值来确定像素的可见性。它可以有效解决遮挡关系,避免对被遮挡像素进行不必要的渲染,从而提高图形渲染的效率。

Color Buffer

Color Buffer:颜色缓存区

OpenGL中的颜色缓冲区(Color Buffer)是一个用于存储渲染结果的内存区域。当我们通过OpenGL渲染场景时,渲染的结果会被存储到颜色缓冲区中。通常情况下,颜色缓冲区是一个二维数组,每个元素代表屏幕上的一个像素点,存储着该像素点的颜色信息。

在OpenGL中,颜色缓冲区可以包括一个或多个颜色缓冲区。例如,我们可以创建一个双缓冲区(Double Buffer),其中包括前缓冲区和后缓冲区,用于实现平滑的动画效果。

当我们完成一次渲染后,OpenGL会将颜色缓冲区中的像素值发送到帧缓冲区(Frame Buffer),并在屏幕上显示出来。我们也可以使用OpenGL的一些API函数对颜色缓冲区进行读写操作,例如修改像素的颜色、清空颜色缓冲区等。

 

Stencil Buffer

Stencil Buffer:模板缓存区

为屏幕上的每一个像素保存一个8位的无符号整数,跟模板缓冲区进行比较并决定是否保留像素称为模板测试

模板测试发生在透明度测试之后,深度测试之前

img

模板缓冲区默认值为0(测试得到),并且我推测模板缓冲区每帧执行完会进行一个刷新

要加模板测试,就在Shader的Pass开头写Stencil{ }结构体。如果每个Pass都用,则可以提到外面。

 

参考连接:

Stencil Buffer:https://www.cnblogs.com/FlyingZiming/p/12937642.html

Stencil Buffer:https://www.jianshu.com/p/f79f0da90103

Depth Buffer:https://zhuanlan.zhihu.com/p/638266570

Color Buffer: https://www.cnblogs.com/errorman/p/17222536.html

Frame Buffer: https://blog.csdn.net/alexhu2010q/article/details/101436270

OpenGL Frame Buffer: https://zhuanlan.zhihu.com/p/631073748

标签:Stencil,OpenGL,Buffer,像素,深度,缓冲区
From: https://www.cnblogs.com/ArsenalfanInECNU/p/18001468

相关文章

  • 【极简】Pytorch中的register_buffer()
    registerbuffer定义模型能用torch.save保存的、但是不更新参数。使用:只要是nn.Module的子类就能直接self.调用使用:classA(nn.Module):#...self.register_buffer('betas',torch.linspace(beta_1,beta_T,T).double())#...手动定义参数上述的参数显然可以......
  • 04 OpenGL渲染管线
    OpenGL做了什么?坐标系+物体+摄像机(观察者),经过渲染最后得到二位屏幕的图像。渲染过程第一步:首先要初始化一个三角形(定点位置、每个定点的属性),还需要初始化摄像机(观察者)。第二步:移动三角形,移动摄像机(观察者)。第三步:以观察者为中心,观察世界。第四步:投影-->把能看到的......
  • Mocha MemoryBufferQueue 设计概述
    目录前言MemoryBufferQueue功能概述Buffer模块API设计MemoryBufferQueue的设计Partition的设计对并发的支持Partition的动态扩容Segment的回收机制前言Mocha是一个基于.NET开发的APM系统,同时提供可伸缩的可观测性数据分析和存储平台。更多关于Mocha的介绍,可以参......
  • vs+qt中使用opengl及关键报错“无法打开包括文件: no such file or directory”与“err
    参考链接https://blog.csdn.net/qq_22533607/article/details/79792083http://t.csdnimg.cn/T8II5http://t.csdnimg.cn/JP8k7基础准备:vs中配置qt插件(略)关键步骤:创建QtWidgetApplication项目将BaseClass修改成QWidget,方框中的内容可以不勾,个人习惯ui文件中添加open......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    前言Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交......
  • OpenGL学习(一)
    OpenGL学习(一)基本概念因为OpenGLES是OpenGL的一个子集,所以下面就主要介绍一些有关OpenGL的一些基本概念。OpenGL的结构可以从逻辑上划分为下面3个部分:图元(Primitives)缓冲区(Buffers)光栅化(Rasterize)图元(Primitives)在OpenGL的世界里,我们只能画点、线、三角形这......
  • OpenGL学习(二)——GLFW
    OpenGL学习(二)——GLFW参考资料:【双语】【TheCherno】OpenGL_哔哩哔哩_bilibili[LearnOpenGLCN(learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01Gettingstarted/02Creatingawindow/)LearnOpenGL示例环境搭建-知乎(zhihu.com)创建窗口[你好,窗......
  • OpenGL学习(三)——GLSL
    OpenGL学习(三)——GLSL参考资料:【双语】【TheCherno】OpenGL_哔哩哔哩_bilibili[LearnOpenGLCN(learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01Gettingstarted/02Creatingawindow/)LearnOpenGL示例环境搭建-知乎(zhihu.com)GLSL着色器(Shad......
  • Unity3D DrawCall和openGL、光栅化等有何内在联系详解
    Unity3D是一款跨平台的游戏引擎,广泛应用于游戏开发领域。在Unity3D中,DrawCall是一个重要的概念,它与OpenGL、光栅化等技术有着密切的内在联系。本文将详细解释DrawCall的概念,并给出相关技术的详细解释和代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础......
  • uniapp ArrayBuffer转16进度字符串 以及 十六进制转ASCII码
    1.ArrayBuffer转16进度字符串//ArrayBuffer转16进度字符串示例//ab2hex(buffer){//consthexArr=Array.prototype.map.call(//newUint8Array(buffer),//function(bit){//......