ND-Buffer 和 G-Buffer 有什么区别?
What is the difference between a ND-Buffer and a G-Buffer?
我是 WebGL 的菜鸟。我读了几篇 ND-Buffers 和 G-Buffers 的帖子,好像它是 WebGL 开发的战略选择。
ND-Buffers 和 G-Buffers 与渲染管线有什么关系? ND-Buffers 是否仅用于前向渲染而 G-Buffers 仅用于延迟渲染?
如何实现两者的 JavaScript 代码示例对我理解差异很有用。
选择渲染路径是 3D 渲染器的主要架构决策,无论它使用什么 API。该选择在很大程度上取决于渲染器必须支持的功能集及其性能要求。
大量所述特征由所谓的 screen-space effects. If means that we render some crucial data about each pixel of the screen to a set of renderbuffers and then using that data (not the geometry) to compute some new data needed for a frame. Ambient Occlusion 组成,是这种效果的一个很好的例子。基于像素的一些空间值,我们计算出 "mask",稍后我们可以使用它来正确地为每个像素着色。
此外,还有一个渲染通道几乎完全依赖于屏幕-space 计算。而且确实是Deferred Shading。这就是 G 缓冲区的用武之地。计算像素颜色所需的所有数据都渲染到 G 缓冲区:一组存储该数据的渲染缓冲区。它自身的数据(以及 G-buffer 的渲染缓冲区的含义)可能不同:漫反射分量、镜面反射分量、反光度、法线、位置、深度等。作为帧渲染的一部分,现代延迟着色引擎使用 screen-space ambient occlusion (SSAO),它使用来自多个 G-buffer 的渲染缓冲区的数据(通常是位置、法线和深度)。
关于 ND 缓冲区。在我看来,这不是一个广泛使用的术语(Google 除了这个问题外,没有找到任何相关信息)。我相信 ND 代表 Normal-Depth。它们只是针对特定算法和效果的 G 缓冲区的特定情况(在论文中是 SSAO)。
因此,使用 G 缓冲区(和 ND 缓冲区作为 G 缓冲区的子集)和 exade 取决于您正在实施的着色算法和效果。但是所有屏幕-space 计算都需要某种形式的 G 缓冲区。
P.S。您 link 的论点不准确。作者列出了在 GLES 2.0 上实现 ND 缓冲区的能力作为该方法的优势。然而,这实际上是不可能的,因为 GLES 2.0 没有深度纹理(它们已添加到 OES_depth_texture
扩展中)。
G-Buffers 只是一组通常用于延迟渲染的缓冲区。
Wikipedia 给出了 g-buffer 中常见数据类型的一个很好的例子
漫反射颜色信息
世界space或屏幕space法线
深度缓冲区/Z 缓冲区
这 3 个缓冲区的组合称为 "g-buffer"
从几何图形和 material 数据生成这 3 个缓冲区,然后您可以 运行 着色器将它们组合起来生成最终图像。
实际进入 g 缓冲区的内容取决于特定的 engine/renderer。例如 Unity3D's deferred renders 之一包含漫反射颜色、遮挡、镜面反射颜色、粗糙度、法线、深度、模板、发射、光照、光照贴图、反射概率。
ND 缓冲区仅代表 "normal depth buffer",这使其成为典型 g 缓冲区中常见内容的子集。
至于一个样本,对于 SO 来说可能太大了,但是 an article about deferred rendering in WebGL on MDN
我想为之前的答案添加更多信息。
I read in several posts of ND-Buffers and G-Buffers as if it were a
strategic choice for WebGL development.
延迟渲染最重要的部分之一是,如果给定的平台支持 MRT(多个渲染目标)。如果没有,您将无法在每次渲染之间共享着色器中的部分计算,并且它还会迫使您 运行 渲染次数与 "layers" 一样多(在 unity 3D 的情况下,它可能高达 11 次?)。这可能会大大减慢您的程序。
在这个问题中阅读更多内容
Is deferred rendering/shading possible with OpenGL ES 2.0 ?
Webgl 不支持 MRT,但它有扩展名:
https://www.khronos.org/registry/webgl/extensions/WEBGL_draw_buffers/
还有深度纹理的扩展:
https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
所以使用延迟渲染技术应该是可以的,但是速度不好猜。
我是 WebGL 的菜鸟。我读了几篇 ND-Buffers 和 G-Buffers 的帖子,好像它是 WebGL 开发的战略选择。
ND-Buffers 和 G-Buffers 与渲染管线有什么关系? ND-Buffers 是否仅用于前向渲染而 G-Buffers 仅用于延迟渲染?
如何实现两者的 JavaScript 代码示例对我理解差异很有用。
选择渲染路径是 3D 渲染器的主要架构决策,无论它使用什么 API。该选择在很大程度上取决于渲染器必须支持的功能集及其性能要求。
大量所述特征由所谓的 screen-space effects. If means that we render some crucial data about each pixel of the screen to a set of renderbuffers and then using that data (not the geometry) to compute some new data needed for a frame. Ambient Occlusion 组成,是这种效果的一个很好的例子。基于像素的一些空间值,我们计算出 "mask",稍后我们可以使用它来正确地为每个像素着色。
此外,还有一个渲染通道几乎完全依赖于屏幕-space 计算。而且确实是Deferred Shading。这就是 G 缓冲区的用武之地。计算像素颜色所需的所有数据都渲染到 G 缓冲区:一组存储该数据的渲染缓冲区。它自身的数据(以及 G-buffer 的渲染缓冲区的含义)可能不同:漫反射分量、镜面反射分量、反光度、法线、位置、深度等。作为帧渲染的一部分,现代延迟着色引擎使用 screen-space ambient occlusion (SSAO),它使用来自多个 G-buffer 的渲染缓冲区的数据(通常是位置、法线和深度)。
关于 ND 缓冲区。在我看来,这不是一个广泛使用的术语(Google 除了这个问题外,没有找到任何相关信息)。我相信 ND 代表 Normal-Depth。它们只是针对特定算法和效果的 G 缓冲区的特定情况(在论文中是 SSAO)。
因此,使用 G 缓冲区(和 ND 缓冲区作为 G 缓冲区的子集)和 exade 取决于您正在实施的着色算法和效果。但是所有屏幕-space 计算都需要某种形式的 G 缓冲区。
P.S。您 link 的论点不准确。作者列出了在 GLES 2.0 上实现 ND 缓冲区的能力作为该方法的优势。然而,这实际上是不可能的,因为 GLES 2.0 没有深度纹理(它们已添加到 OES_depth_texture
扩展中)。
G-Buffers 只是一组通常用于延迟渲染的缓冲区。
Wikipedia 给出了 g-buffer 中常见数据类型的一个很好的例子
漫反射颜色信息
世界space或屏幕space法线
深度缓冲区/Z 缓冲区
这 3 个缓冲区的组合称为 "g-buffer"
从几何图形和 material 数据生成这 3 个缓冲区,然后您可以 运行 着色器将它们组合起来生成最终图像。
实际进入 g 缓冲区的内容取决于特定的 engine/renderer。例如 Unity3D's deferred renders 之一包含漫反射颜色、遮挡、镜面反射颜色、粗糙度、法线、深度、模板、发射、光照、光照贴图、反射概率。
ND 缓冲区仅代表 "normal depth buffer",这使其成为典型 g 缓冲区中常见内容的子集。
至于一个样本,对于 SO 来说可能太大了,但是 an article about deferred rendering in WebGL on MDN
我想为之前的答案添加更多信息。
I read in several posts of ND-Buffers and G-Buffers as if it were a strategic choice for WebGL development.
延迟渲染最重要的部分之一是,如果给定的平台支持 MRT(多个渲染目标)。如果没有,您将无法在每次渲染之间共享着色器中的部分计算,并且它还会迫使您 运行 渲染次数与 "layers" 一样多(在 unity 3D 的情况下,它可能高达 11 次?)。这可能会大大减慢您的程序。
在这个问题中阅读更多内容 Is deferred rendering/shading possible with OpenGL ES 2.0 ?
Webgl 不支持 MRT,但它有扩展名: https://www.khronos.org/registry/webgl/extensions/WEBGL_draw_buffers/
还有深度纹理的扩展: https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/
所以使用延迟渲染技术应该是可以的,但是速度不好猜。