hdrp-延迟渲染-gbuffer

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是自发光或者是环境光。

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/123599148
今日推荐