hdrp-延迟渲染-gbuffer

本文详细介绍了GBuffer在高清渲染管线(HDRenderPipeline)中的作用和工作流程。GBufferManager在初始化时创建多个渲染目标,用于存储场景信息。RenderGBuffer阶段通过CommandBuffer设置渲染目标,并将缓冲区绑定为纹理。ShaderPassGBuffer在Lit.shader的GBuffer pass中执行,处理顶点和片元数据,计算表面属性并编码到GBuffer的不同部分,如基础颜色、法线、粗糙度、金属度等。这一过程对于实时图形渲染的光照和细节表现至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GBufferManager

gbuffer在HDRenderPipeline构造的时候会创建GBufferManager,默认会构造指定数量的gbuffer的rt,一般是4张rt加一张深度rt。

RenderGBuffer

在ExecuteRenderRequest中执行RenderGBuffer,然后执行

CoreUtils.SetRenderTarget(cmd, m_GbufferManager.GetBuffersRTI(hdCamera.frameSettings), m_SharedRTManager.GetDepthStencilBuffer());来通过commandbuffer渲染。

以及执行m_GbufferManager.BindBufferAsTextures(cmd);来绑定buffer到commandbuffer的texture中。

ShaderPassGBuffer

执行到shader中是Lit.shader的GBuffer的pass中。核心在ShaderPassGBuffer.hlsl这个shader中做,他有两个版本,一个是会用细分着色的,一个是只用顶点和片元的。

顶点着色:

然后在vert中主要做一些顶点数据准备,比如世界坐标,世界法线,切线以及uv,颜色等。然后vert中的PackVaryingsType就会区分是细分还是直接转片元。PackVaryingsToPS是直接转到片元。

片元:

然后是Frag,GetSurfaceAndBuiltinData是在LitData.hlsl中,是获取表现信息的地方,比如像素的法线,基础颜色,高光遮蔽,粗糙度,金属度等。

然后ENCODE_INTO_GBUFFER,在MaterialGBufferMacros.hlsl中执行EncodeIntoGBuffer执行到Lit.hlsl的EncodeIntoGBuffer,核心是对四个buffer赋值。

分别是

outGBuffer0为基础颜色级高光遮蔽,

outGBuffer1是法线以及a通道是粗糙度

outGBuffer2是高光遮蔽及厚度,或者是各向异性及金属度,或者是菲涅尔,根据用的材质决定。

outGBuffer3是自发光或者是环境光。

在前向渲染中使用G-Buffer是一种较为特殊的配置,因为G-Buffer通常用于延迟渲染(Deferred Rendering)流程中。前向渲染(Forward Rendering)是一种传统的渲染方式,其核心思想是对于每个光源,逐物体进行光照计算,而延迟渲染则会先将几何信息存储在G-Buffer中,随后在光照阶段进行处理。然而,前向渲染中也可以引入G-Buffer的思想,用于实现更复杂的后处理效果或混合渲染技术。 ### 配置与使用G-Buffer在前向渲染中的方法 1. **G-Buffer的组成** G-Buffer通常由多个颜色缓冲组成,分别用于存储不同的几何与材质属性,如: - 漬度(Albedo) - 法线(Normal) - 深度(Depth) - 粗糙度(Roughness) - 金属度(Metallic) - 视图空间坐标(View Space Position) 这些信息可以在前向渲染过程中通过多目标渲染(MRT, Multiple Render Targets)写入多个颜色附件中。 2. **前向渲染流程的调整** 在标准的前向渲染流程中,每个物体在渲染时都会进行光照计算。若要引入G-Buffer,需要将渲染流程分为两个主要阶段: - **几何阶段(Geometry Pass)**:将所有不透明物体的几何与材质属性渲染到G-Buffer中。 - **光照与合成阶段(Lighting & Compositing Pass)**:使用G-Buffer中的信息进行光照计算,并将结果输出到最终帧缓冲中。 3. **着色器调整** 在几何阶段,顶点着色器与片段着色器需要输出多个值到不同的颜色附件中。例如,片段着色器可能如下所示: ```glsl #version 450 out vec4 gAlbedo; out vec4 gNormal; out vec4 gDepth; in vec3 fragPos; in vec3 normal; in vec2 texCoords; uniform sampler2D albedoMap; void main() { gAlbedo = texture(albedoMap, texCoords); gNormal = vec4(normalize(normal), 1.0); gDepth = vec4(fragPos.z, 0.0, 0.0, 1.0); } ``` 4. **性能优化与批处理** 在使用G-Buffer时,需要注意绘制调用的优化。例如,可以通过动态批处理(Dynamic Batching)来减少绘制调用的数量,从而提升性能。在Unity等引擎中,可以启用动态批处理来对小型动态对象进行优化[^3]。 5. **后期处理与光照计算** 在完成G-Buffer的构建后,可以在后续的后处理阶段利用这些信息进行复杂的光照计算、屏幕空间反射(SSR)、环境光遮蔽(SSAO)等效果的实现。这种做法可以避免重复的几何计算,提高渲染效率。 6. **适用场景** 尽管前向渲染中引入G-Buffer可以带来更高质量的光照与后处理效果,但其代价是更高的内存占用与渲染延迟。因此,该技术更适用于需要复杂光照与后处理的高端应用,如游戏、影视渲染等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值