Graphics 什么是深层帧缓冲区?

Graphics 什么是深层帧缓冲区?,graphics,buffer,framebuffer,Graphics,Buffer,Framebuffer,在实时图形应用程序中,我认为帧缓冲区是保存最终光栅化图像的内存,该图像将在单个帧中显示 对深帧缓冲区的引用似乎暗示存在一些缓存(顶点和材质信息),但不清楚这些数据用于什么,或者如何使用 与标准帧缓冲区相比,深度帧缓冲区具体是什么?其用途是什么? 谢谢。谷歌是你的朋友 这可能意味着两件事: 您存储的不仅仅是每像素RGBA。例如,您可能正在存储法线或其他照明信息,以便以后可以重新进行照明 每像素存储多个颜色和深度值。例如,这对于支持与订单无关的透明度非常有用 z缓冲区类似于通常用于存储3D场

在实时图形应用程序中,我认为帧缓冲区是保存最终光栅化图像的内存,该图像将在单个帧中显示

对深帧缓冲区的引用似乎暗示存在一些缓存(顶点和材质信息),但不清楚这些数据用于什么,或者如何使用

与标准帧缓冲区相比,深度帧缓冲区具体是什么?其用途是什么?

谢谢。谷歌是你的朋友

这可能意味着两件事:

  • 您存储的不仅仅是每像素RGBA。例如,您可能正在存储法线或其他照明信息,以便以后可以重新进行照明

  • 每像素存储多个颜色和深度值。例如,这对于支持与订单无关的透明度非常有用


  • z缓冲区类似于通常用于存储3D场景“图像”的颜色缓冲区,但它不存储颜色信息(以rgb像素的2D阵列的形式),而是存储从相机到通过帧缓冲区的每个像素可见的对象的距离

    传统上,对于帧中的任何给定像素,z-buffer仅表示从相机到3D中最近对象的距离。该技术的优点在于,如果使用z缓冲区渲染了2个图像,则可以使用2D程序(例如)对其进行重新合成,但是图像a中位于图像“B”中像素“前面”的像素将被合成在重新合成的图像之上。为了确定这些像素是否在前面,我们可以使用存储在图像各自z缓冲区中的信息。例如,假设我们想要在像素坐标(100100)处从图像A和B合成像素。如果z缓冲区中坐标(100100)处存储的距离(z值)对于图像A为9.13,对于图像B为5.64,则在重新合成的图像C中,在像素坐标(100100)处,我们将从图像B放置像素(因为它对应于3D场景中通过图像a中的该像素可见的对象前方的曲面)

    现在,当对象是不透明的,而不是透明的时候,这种方法非常有效。因此,当对象是透明的(例如渲染体积、云或透明表面层时),我们需要存储多个z值。还要注意,“不透明度”随着体积对象的密度或透明层数量的增加而变化。无论如何,深度图像深度缓冲区在技术上与z缓冲区类似,但它不仅存储一个深度值或z值,而且存储多个深度值,还存储图像的不透明度对象的每个深度值

    一旦我们存储了这些信息,就可以在后期制作中正确地(即准确地)将两个或多个图像与透明胶片一起重新组合。例如,如果渲染两个云,并且这些云在深度上重叠,则它们的可见性将正确地重新组合,就像它们在同一场景中一起渲染一样

    为什么我们要使用这种技术?通常是因为渲染包含体积元素的场景通常速度较慢。因此,最好将它们与场景中的其他对象分开渲染,这样,如果需要对实体对象进行调整,就不需要再次重新渲染体积元素

    这项技术主要由皮克斯在他们开发和销售的渲染器(Prman)中流行。阿凡达(新西兰的Weta Digital)是第一部大量使用深度合成的电影之一

    见:

    这种技术的缺点是:深度图像非常沉重。每像素需要存储许多深度值(这些值以浮点形式存储)。根据图像分辨率和场景深度复杂度,此类图像的大小不会超过几百到几GB。此外,您还可以正确地重新组合体积对象,但它们不会相互投射阴影,如果在同一场景中一起渲染对象,则会产生阴影。这使得场景管理比平常稍微复杂一些,……但这通常会得到妥善处理


    很多信息都可以在上找到(供将来参考)。

    非常感谢您提供了清晰简洁的回复。实际上,我做了一个相当长的网络搜索;我登陆了您建议的第一个网站,该网站稍微谈到了深帧缓冲区,但没有真正解释它们是什么。此外,这是我第一次听说“深度图像”,所以你的第二个建议可能特别有用。哇,那太彻底了,谢谢!我甚至没有想到如何在脱机渲染中使用帧缓冲区。所以我猜深度帧缓冲区与普通的一样,但有额外的信息(如不透明度)存储在其z缓冲区中?我将要求scratchapixel的团队就此编写一个课程。深度帧缓冲区实际上类似于z缓冲区,但您存储的深度值不止一个,其中每个“沿”像素存储的深度值对应于该像素的相机光线必须从相机移动的距离(z=0)到相交的对象。在周末查看他们的网站,你会看到关于这个主题的课程(附言:如果你喜欢答案,别忘了投赞成票;-)