電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>人工智能>LWRP渲染流程梳理

LWRP渲染流程梳理

2021-02-03 | pdf | 163.22KB | 次下載 | 2積分

資料介紹

渲染應(yīng)用階段

LWRP現(xiàn)在再unity2019已經(jīng)成為默認的管線了,替代了原來的builtin管線,我當(dāng)前項目用的還是2018.4的lwrp,使用了一段時間,覺得還是想總結(jié)下lwrp的渲染流程。總結(jié)過程中也學(xué)到了不少東西,所以想在這里分享下我了解的lwrp管線

執(zhí)行應(yīng)用階段流程順序如下:




lwrp從結(jié)果來看就是前向渲染的流程,沒有g(shù)buffer保存幾何信息。他實現(xiàn)原理是將不透明渲染,天空盒渲染,透明渲染加入CommandBuffer里,最終一次性提交渲染。其中如果需要Depth或Opaque圖片則可以拷貝到rt輸出到指定全局變量給開發(fā)用。

下面我想說下我了解的lwrp的詳細流程,設(shè)計的東西會比較多。也是看代碼的過程中學(xué)習(xí)了很多東西。

下面分享下:

lwrp整個渲染的主入口在LightweightRenderPipeline,他繼承的RenderPipeline,是rsp的渲染流程關(guān)鍵類

首先是構(gòu)造函數(shù)

PipelineSettings:這里會獲取LightweightRenderPipelineAsset(也就是我們外部傳入的管線的參數(shù)

ScriptableRenderer:srp渲染器,需要把LightweightRenderPipelineAsset傳給他。他是渲染核心,他會收集所有當(dāng)前幀要渲染的pass,以及他會擁有渲染相關(guān)的燈光和后處理等執(zhí)行方法。

PerFrameBuffer:每幀設(shè)置的緩存數(shù)據(jù)

_GlossyEnvironmentColor:主要用于PBR這塊的全局光照的顏色,在Lighting.hlsl的GlossyEnvironmentReflection,可以看到他主要是全局光照的高光部分顏色。

_SubtractiveShadowColor:主要用在除了主光源外的lightmap計算的陰影顏色。在SubtractDirectMainLightFromLightmap里使用

PerCameraBuffer:每幀攝像機的緩存數(shù)據(jù)

_InvCameraViewProj:視圖空間到投影空間的轉(zhuǎn)置矩陣,如果用原始矩陣乘以反向矩陣結(jié)果為identity矩陣。如果一些矩陣以一個特定的方式變換向量,反向矩陣可以將他們變換回去。例如worldToLoclaMatrix和localToWorldMatrix是互逆的。

_ScaledScreenParams:屏幕縮放參數(shù)

antiAliasing從asset中獲取msaaSampleCount

Shader.globalRenderPipeline = "LightweightPipeline";設(shè)置全局管線為LightweightPipeline

lightsDelegate:全局光照的回調(diào)

執(zhí)行到Render中執(zhí)行具體渲染流程:

SetupPerFrameShaderConstants:設(shè)置全局光照的數(shù)據(jù),設(shè)置PerFrameBuffer中的_GlossyEnvironmentColor和_SubtractiveShadowColor。

其中_GlossyEnvironmentColor是通過球形諧波方程決定顏色的,最后要轉(zhuǎn)到當(dāng)前顏色空間(gamma空間或線性空間)

_SubtractiveShadowColor則是直接賦值具體的除去主光源后的陰影顏色,只是也有最后轉(zhuǎn)到當(dāng)前顏色空間的轉(zhuǎn)換。

對當(dāng)前Render給過來當(dāng)前有哪些相機渲染的數(shù)據(jù)來進行每個相機的渲染RenderSingleCamera。

每個相機中的渲染步驟如下:

CullResults.GetCullingParameters:獲取相機下的裁剪參數(shù),如果返回false說明沒有聶榮,不需要渲染這個相機。如果需要考慮到類似vr等情況需要區(qū)分左右眼的攝像機時需要把stereoAware設(shè)置為true。

CommandBuffer cmd = CommandBufferPool.Get(k_RenderCameraTag):這里從命令緩存池中獲取一個gl命令緩存,CommandBuffer主要用于收集一系列g(shù)l指令,然后之后執(zhí)行。

ProfilingSample是對指定名字做性能采樣。

InitializeCameraData:初始化攝像機數(shù)據(jù)。

cameraData.msaaSamples:如果數(shù)量大于1說明需要多重采樣

cameraData.isSceneViewCamera:這個是查看當(dāng)前要渲染的是否在unity的scene視圖

cameraData.isOffscreenRender:屏幕外渲染,如果攝像機的targettexture存在并且不是scene視圖則這個為true。

cameraData.isStereoEnabled:就是左右眼做區(qū)別的攝像機,用于vr等

cameraData.isHdrEnabled:是否支持hdr,也就是高動態(tài)范圍圖像,就是可以在高光情況下能看清一些光照細節(jié),提高細節(jié)渲染。

cameraData.postProcessLayer:后處理

cameraData.postProcessEnabled:是否開啟后處理

cameraData.renderScale:渲染縮放比例

cameraData.opaqueTextureDownsampling:降采樣

cameraData.isDefaultViewport:如果是正常的(0,0,1,1)則是默認的

cameraData.maxShadowDistance:最大陰影范圍

cameraData.requiresDepthTexture:是否啟用深度紋理

cameraData.requiresOpaqueTexture:是否保存非透明顏色信息

cameraData.defaultOpaqueSortFlags:默認的非透明渲染順序

SetupPerCameraShaderConstants

PerCameraBuffer._ScaledScreenParams:是一個vector4,包括相機像素的長寬和紋素

PerCameraBuffer._InvCameraViewProj:設(shè)置攝像機視角的逆矩陣,通過GL.GetGPUProjectionMatrix獲取到當(dāng)前gpu正確坐標系的投影矩陣,再跟camera.worldToCameraMatrix視圖矩陣相乘得到視圖到投影的矩陣,再用Matrix4x4.Inverse獲取逆矩陣。

cullingParameters.shadowDistance:設(shè)置陰影距離,這里會根據(jù)攝像機最遠渲染距離來獲得最遠可達到的距離。

ScriptableRenderContext.ExecuteCommandBuffer(cmd):執(zhí)行命令緩存

cmd.Clear();清除緩存數(shù)據(jù)

CullResults.Cull:根據(jù)裁剪的參數(shù)cullingParameters和context指定的渲染指令得到裁剪的燈光,物體等。

InitializeRenderingData:初始化渲染相關(guān)數(shù)據(jù)

GetMainLight:獲取主光源,如果是直線光并且mainLightRenderingMode不為LightRenderingMode.PerPixel就是主光源

mainLightCastShadows:如果可見光存在而且陰影設(shè)置存在則為true

additionalLightsCastShadows:如果additionalLightsRenderingMode是LightRenderingMode.PerPixel并且可見光存在并且lightType是LightType.Spot且陰影存在則為true

InitializeLightData:初始化燈光數(shù)據(jù),這里設(shè)置了mainLightIndex(也就是GetMainLight獲取的),設(shè)置additionalLightsCount獲取疊加光源的數(shù)量,maxPerObjectAdditionalLightsCount最大疊加光源數(shù)量,shadeAdditionalLightsPerVertex就是是否是疊加光源,visibleLights可視光源,supportsMixedLighting支持混合光源

InitializeShadowData:初始化陰影數(shù)據(jù),如果有多光源會添加LWRPAdditionalLightData到光源的gameobject上,m_ShadowBiasData會設(shè)置陰影偏移和陰影發(fā)現(xiàn)偏移,主要用于解決自陰影的問題。supportsMainLightShadows支持主光源陰影 。mainLightShadowCascadesCount是陰影的級聯(lián)個數(shù),(mainLightShadowmapWidth、mainLightShadowmapHeight)主光源陰影貼圖的寬高。mainLightShadowCascadesSplit是陰影的級聯(lián)分割,supportsAdditionalLightShadows是否支持多光源陰影。additionalLightsShadowmapWidth、additionalLightsShadowmapHeight是多光源陰影貼圖的寬和高都是additionalLightsShadowmapResolution。supportsSoftShadows支持軟陰影

supportsDynamicBatching:是否支持動態(tài)批處理,這個是lwrp的動態(tài)批處理

設(shè)置完渲染數(shù)據(jù)后就是開始設(shè)置渲染的順序了:

renderer.Clear():再設(shè)置之前需要清理renderer的數(shù)據(jù),不然前一幀渲染的dc是不會清掉的,dc就會越來越高。

setupToUse.Setup(renderer, ref renderingData):默認lwrp是用DefaultRendererSetup來設(shè)置的,當(dāng)然你也可以實現(xiàn)IRendererSetup然后傳入Render來自己實現(xiàn)。

DefaultRendererSetup:lwrp默認會有一系列渲染過程。會再Setup中確定渲染的先后。

SetupPerObjectLightIndices設(shè)置每個對象光照信息

CreateRenderTextureDescriptor創(chuàng)建rt數(shù)據(jù)信息

GetCameraClearFlag獲取當(dāng)前攝像機清理方式,lwrp對這層做了一些處理,主要是對深度剔除做了一些選項

如果是渲染到紋理則用CreateLightweightRenderTexturesPass這個pass執(zhí)行一次渲染。

如果有渲染前要執(zhí)行的pass要實現(xiàn)IBeforeRender接口,并且可以多個pass

如果支持主光源陰影投放則執(zhí)行MainLightShadowCasterPass的pass

如果支持多光源陰影投放則執(zhí)行AdditionalLightsShadowCasterPass

之后執(zhí)行SetupForwardRenderingPass,這個pass是必然執(zhí)行的,設(shè)置攝像機到context里

如果支持深度貼圖獲取的話會執(zhí)行DepthOnlyPass(requiresDepthPrepass決定是否執(zhí)行他),這里會用一個rt保存深度貼圖新消息

如果支持屏幕空間陰影獲取,則會執(zhí)行ScreenSpaceShadowResolvePass,這里會用一個rt記錄屏幕空間中的陰影貼圖

然后執(zhí)行SetupLightweightConstanstPass,主要設(shè)置主光源和其他光源的顏色,位置以及其他屬性。如果不設(shè)置則會是默認顏色和位置等信息。

然后執(zhí)行RenderOpaqueForwardPass,這個pass定義了兩個pass名,LightweightForward和SRPDefaultUnlit。然后再Execute申請cmd來做不透明渲染。

如果支持后處理則會執(zhí)行OpaquePostProcessPass,里面是申請一個臨時rt做相關(guān)不透明的后處理。

如果是相機是天空盒清除方式的話并且天空盒不是空的話則執(zhí)行DrawSkyboxPass,里面會繪制天空盒

如果需要天空盒處理之后執(zhí)行的話需要繼承IAfterSkyboxPass實現(xiàn)相關(guān)pass

如果是支持深度貼圖的話并且沒有執(zhí)行requiresDepthPrepass的話(就是前面執(zhí)行DepthOnlyPass的判斷)則會執(zhí)行CopyDepthPass,這里主要是拷貝深度貼圖到全局變量_CameraDepthAttachment中,shader可以直接獲取這個變量(如果有開深度貼圖獲?。?/p>

如果開啟了接收不透明貼圖的話則執(zhí)行CopyColorPass,這里主要是把不透明渲染后的顏色輸出到臨時rt中。

然后執(zhí)行RenderTransparentForwardPass,透明渲染方式

如果支持后處理則執(zhí)行TransparentPostProcessPass,也是一樣申請一個臨時rt做相關(guān)透明渲染的后處理。如果不需要并且不支持屏幕外渲染并且不是渲染到紋理的則要執(zhí)行FinalBlitPass,這里主要設(shè)置貼圖到全局變量_BlitTex,然后把顏色blit到內(nèi)置rt中

然后如果攝像機有IAfterRender的mono則會執(zhí)行pass中的GetPassToEnqueue方法。

最后還會有一個EndXRRenderingPass的渲染,這個是支持立體攝像機的情況下執(zhí)行的,主要是停止立體攝像機渲染

然后再到外面renderer.Execute(context, ref renderingData);也就是把所有pass都執(zhí)行一次。(前面只是加入到列表中,并沒有執(zhí)行每個pass的execute)

最后需要context.Submit來提交渲染,這時相應(yīng)的gpu才會根據(jù)cmd來執(zhí)行所有的pass

這樣整個渲染流程的應(yīng)用階段就算完成了,但是其實每個pass里面還有一些處理過程,我還是分到下一章再總結(jié)了!


來源:電子創(chuàng)新網(wǎng)

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1電子電路原理第七版PDF電子教材免費下載
  2. 0.00 MB  |  1491次下載  |  免費
  3. 2單片機典型實例介紹
  4. 18.19 MB  |  95次下載  |  1 積分
  5. 3S7-200PLC編程實例詳細資料
  6. 1.17 MB  |  27次下載  |  1 積分
  7. 4筆記本電腦主板的元件識別和講解說明
  8. 4.28 MB  |  18次下載  |  4 積分
  9. 5開關(guān)電源原理及各功能電路詳解
  10. 0.38 MB  |  11次下載  |  免費
  11. 6100W短波放大電路圖
  12. 0.05 MB  |  4次下載  |  3 積分
  13. 7基于單片機和 SG3525的程控開關(guān)電源設(shè)計
  14. 0.23 MB  |  4次下載  |  免費
  15. 8基于AT89C2051/4051單片機編程器的實驗
  16. 0.11 MB  |  4次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234313次下載  |  免費
  3. 2PADS 9.0 2009最新版 -下載
  4. 0.00 MB  |  66304次下載  |  免費
  5. 3protel99下載protel99軟件下載(中文版)
  6. 0.00 MB  |  51209次下載  |  免費
  7. 4LabView 8.0 專業(yè)版下載 (3CD完整版)
  8. 0.00 MB  |  51043次下載  |  免費
  9. 5555集成電路應(yīng)用800例(新編版)
  10. 0.00 MB  |  33562次下載  |  免費
  11. 6接口電路圖大全
  12. 未知  |  30320次下載  |  免費
  13. 7Multisim 10下載Multisim 10 中文版
  14. 0.00 MB  |  28588次下載  |  免費
  15. 8開關(guān)電源設(shè)計實例指南
  16. 未知  |  21539次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935053次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537793次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234313次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191183次下載  |  免費
  13. 7十天學(xué)會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183277次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138039次下載  |  免費