《實時光線追蹤開發指南.pdf》由會員分享,可在線閱讀,更多相關《實時光線追蹤開發指南.pdf(51頁珍藏版)》請在三個皮匠報告上搜索。
1、NVIDIA實時光線追蹤開發指南楊雪青NVIDIA首席開發者技術工程師,2020年12月#page#概要GPU光線追蹤簡介光線追蹤API實時光線追蹤的優化建議合理構建加速結構,優化HitShading,平衡質量與性能,降噪器的設計游戲引擎中的光線追蹤UE4的NVIDIARTX-Dev分支系列#page#GPU光線追蹤簡介#page#GPU光線追蹤簡介光柵化通過投影矩陣把物體投影到屏幕上#page#GPU光線追蹤簡介光線追蹤向場景中發射射線,找到射線與物體的交點#page#GPU光線追蹤軟件接口Microsoftuican.Directx#page#GPU光線追蹤簡介光線追蹤API:高層結構光線
2、求交調用TraceRay()加速結構光線追蹤管線Acceleration StructuresRay Tracing Pipeline著色結果屬性索引著色器表Shader Table資源Resources#page#GPU光線追蹤簡介光線追蹤管線(RayTracingPipeline)Hit Group1.發射光線Ray Generation新Shader類型RayGeneration ShaderTraceRay0DXR:DispatchRays0); HLSL: TraceRayO函數2.求光線與物體的交點Any HiAcCeleration遍歷加速結構(AccelerationStruc
3、tures)StructureTravesal新Shader類型IntersectionShader(可選)Intersection3.處理交點一進行著色,繼續發射光線,等等iTraceRay(新Shader類型ClosestHitShader(可選)和AnyHitShader(可選)Ye4、處理無交點的情況一繼續發射光線,或終止新Shader類型MissShaderMisSCiosestHi皖1#page#GPU光線追蹤簡介加速結構(AccelerationStructure)AS是樹形數據結構,用于加速光線遍歷兩級層次結構底層加速結構(BLAS):對應單個物體,針對基本幾何體信息(三角形及
4、包圍盒頂層加速結構(TLAS):對應場景,存儲多個BLAS的實例(Instance)信息,包括坐標變換數據、材質等AS由驅動創建維護應用程序調用API進行管理兩種方式:構建(Build),更新(Update)DXR: BuildRaytrracingAccelerationStructureO#page#GPU光線追蹤簡介著色器表(ShaderTable)InstanceContributionToHitGrouplndexShaderldenti蕓MisS差差H瑩RayGonMissHiCBVDXRRaType1RarTypeRayTypS0RayIyp1RayTypRayTypeRayTy
5、peRayType C89257100310InstanceAInstance B著色器表用于索引一次光線追蹤中可能用到的所有資源頂層加速結構(TLAS)中的節點指向著色器表中的對應記錄由多條等長的記錄構成DXR:著色器表中可存放常量、resourceview等數據#page#GPU光線追蹤簡介光線追蹤API:全景Top-Level ASRayInstanceInstanceGenerationHit GroupShaderRay TracingPipelineDispatchRaysO倉Shader IdentifierLocal Root ArgumentsShader TableBule
6、rsTexturesConstants#page#實時光線追蹤的優化建議#page#實時光線追蹤的優化建議光線追蹤優化的幾個主要方面合理構建加速結構影響光線求交的效率優化HitShading影響整個光線追蹤流程的效率平衡質量與性能好鋼用在刀刃上提高降噪能力降低光線追蹤的采樣壓力#page#合理構建加速結構加速結構的構建(BUILD)使用異步計算(AsyncCompute)來Build加速結構構建加速結構時,對GPU的各單元利用率很低可以通過異步計算與其他瀘染并行處理Overlapped對TLAS中的實例進行可視化剔除對實例選擇合適的LOD層級在CPU的工作線程中進行操作#page#合理構建加速
7、結構最大程度地利用并行化處理For循環為每個可變形物體設置Transition barrier對相同階段的操作進行批處理For循環為每個可變形物體更新頂點數據更新頂點數據(Dispatch)1設置BarrierFor循環為每個可變形物體設置調用BuildTransition barrier不要在各Build或各Dispatch間放置ResourceFor循環Barrier為每個可變形物體調用Build BLAS對BLASBuild時使用各自的ScratchBuffe把多個對少量頂點變形的Dispatch合并在一起UAV barrier操作Build TLAS#page#合理構建加速結構資源分配
8、對小尺寸的資源進行匯總分配(Pool) CreatePlacedResource0手動分配資源,注意要256字節對齊ID3D12Resource避免內存空間碎片化BLASBLAS1BLAS2.1避免在渣染線程中分配和釋放資源包括CreateCommittedResourceO),CreateHeap()對用上述方法創建的資源的Release()#page#合理構建加速結構使用數據壓縮可以節省顯存使用量壓縮率根據Mesh會有不同,有可能達到50%需要從GPU回讀壓縮后的數據尺寸用于創建新的用于存儲壓縮數據的BUFFER適合用于靜態的BLASBuild BLASAllocate/skip/skip
9、skipEmit compacted sizecompactedCompactRelease originalframesframesframesCopy for readbackbufferHUE#page#合理構建加速結構合理組織幾何體數據使用世界坐標下的軸對齊包圍盒(AABB)來檢測光線與TLAS中的實例的相交對性能有利的理想狀態盡量減少AABB中的空院”盡量不要有AABB的重疊#page#合理構建加速結構合理組織幾何體數據合并幾何體#page#合理構建加速結構合理組織幾何體數據切割幾何體#page#合理構建加速結構合理組織幾何體數據使用幾何體實例化(Instancing)共用相同的BL
10、AS使用各自的材質和位置轉換信息#page#合理構建加速結構注意圖元的形狀和拓撲結構避免又長又細的三角形易在包圍盒中產生大空隙和造成重疊避免使用TriangleFan#page#合理構建加速結構BUILD標志的應用TLASPREFER_FAST_TRACE,一般情況下需要每頓Rebuild滬BLAS盡可能使用GEOMETRY_FLAG_OPAQUE或者INSTANCE_FLAG_FORCE_OPAQUE靜態BLAS PREFER FAST_TRACE可變形的BLAS需根據實際情況PREFER_FAST_TRACE或者PREFER_FAST_BUILD#page#合理構建加速結構對于可變形物體的
11、處理對可見的物體進行Update和Rebuild盡可能使用老的BLAS在沒有變形的時候,還可以根據距離和尺寸來判斷對變形非常大的物體僅用Update可能會導致不良的BLAS可以周期性地調用Rebuild,每隔幾幀執行一次Yes輸出頂點Rebuild BLASYes到rebuild的時候?使用需要變形?可變形物體Update BLASNoNo2nVIDIA#page#合理構建加速結構ALPHA測試的問題”需要使用AnyHitShader打斷硬件的求交遍歷交點的發現是無序的幾何體的包圍盒有重疊山#page#合理構建加速結構對ALPHA測試的處理建議盡量減少透明的區域增加三角形數量來勾勒不透明區域將
12、不透明和透明區域分開減少包圍盒的重疊減小三角形尺寸合并一些幾何體1門H2#page#優化HitShading減少代碼差異盡量減少HitShader的數量StandardSkin51Emissive使用統一的處理來實現,而不是通過編寫包羅萬象的VS-PSVS-PSVS-PSVS-PS超級著色器(Ubershader)最好不要通過直接從VS和PS轉換來獲取HitShader簡化和統一著色處理不需要保留所有光柵化下的特性一些小特性可以通過動態分支處理,而不要單獨配置Hit ShaderReflectionHit Shader把一些通用代碼移出Hit/MissShader可以放入RaygenShade
13、r#page#優化HitShading資源綁定的優化通用數據放在全局的RootSignature中以RootSRV的形式將Index和Vertex數據存放于本地RootSignature中貼圖材質數據可以通過本地RootSignature中RootConstant來索引無綁定(Bindless)資源如果頂點數據格式不統一,可用ByteAddressBuffers來存放Simple Hit Record異步更新ShaderTableHit group IDVertex buffer SRVIndex buffer SRVVertex strideMaterial IDNormal offsetT
14、excoord offset#page#優化HitShading如何應用TRACERAYINLINETraceRayTraceRaylnline有大量材質/HitShader需要在其他Shader類型中使用光追使用TraceRaylnline會導致形成超級著色器口需要使用GroupSharedMemory(ubershader)一些注意事項即使只有一個HitShader,也能很好地工作沒有ShaderTable需要對HitShader提供本地數據綁定需要自己實現AnyHit/AlphaTest的循環操作幾何體資源作為無綁定資源使用,通過如下方式InstanceIndex(),InstanceI
15、D(),GeometryIndex(InstanceContributionToHitGroupIndex()盡量在編譯時設置RayFlagnVIDL#page#優化HitShadingshader(“closesthit-)減少跨TRACE的數據調用voidClosestHit(inout Payloadpayload,inAttribsattribs)constintpi=PrimitiveIndex();f1oat3vO=vertexBufferlindexBufferpi*3+0float3V1= vertexBufferindexBufferpi*3+1盡量避免在調用Trace函數前
16、初始float3v2svertexBufferindexBufferpi*3+2;float3n=normalize(cross(v1-v8,v2-V0);化一個變量卻在Trace調用后使用floatsceneConstants.sceneScalefloat=RayTCurrent();會在一定程度上造成性能開銷float三t*Sf1oat3=WorldRayOrigin()+*WorldRayDirection();float3d=normalize(WorldRayDirection();NVIDIA和微軟正合力解決,讓編譯int2idxA=DispatchRaysIndex().xy;
17、器能自動檢測const float4val = outputBufferidxAPayloadrefl_payload=createReflectionPayload(payload.depth)RayDesc refl_ray=createReflectionRay(p,d,n)refl_payload.color;payload.colorval.xypayload.color.xy+=payload.depth+E;if(idxA.x10000)payload.color.z+=HelperFunc(p,X)#page#優化HitShading管線狀態(PIPELINESTATE)的處理
18、盡量給每個DispatchRay配置一個PipelineState,并且僅包含所需要的Shader最小化如下參數的數值MaxTraceRecursionDepth,MaxPayloadsizelnBytes 和MaxAttributesizelnBytes注意DXR1.1中提供的新標志m PIPELINE FLAG_SKIP_PROCEDURAL PRIMITIVES, PIPELINE FLAG_SKIP_TRIANGLES如需使用大量的Shader考慮使用Collection來進行并行編譯和共享(D3D12_STATE_OBJECT_TYPE_COLLECTION)考慮使用DXR1.1的A
19、ddTostateObjectO)進行增量構建#page#平衡質量與性能如何在光線追蹤中實現貼圖的MIPMAPPING光線追蹤需要開發者指定貼圖采樣的MIP層級如總使用MIP0的貼圖,既影響性能又會造成走樣解決方案RayDifferential(更精確,實現復雜RayCone(易于實現)#page#平衡質量與性能RAYCONE方法概覽=Wi+Y2tm Ray Coneeye射線(起點和方向)”展開角Y起始寬度Wpixel在反射/折射過程中追蹤錐體的變化wo= Yoto用寬度W在交點處計算MIP等級Wi=Wo+Yit1#page#平衡質量與性能使用與光柵化混合染的模式(HYBRID)混合光追半透
20、明染模式一僅用光追瀘染半透明物體的反射保存每層的追染結果和深度信息沒有折射信息半透明物體仍然使用光柵化染著色時參考深度值混合光追所染的反射信息#page#平衡質量與性能使用與光柵化混合漳染的模式(HYBRID)混合光追半透明染模式二使用光追汶染Mesh構成的半透明物體(反射+折射+OIT)瀘染時額外保存每層的汶染結果和深度信息使用光柵化漳染半透明的粒子著色時通過深度信息,混合遮擋粒子的半透明物體的追染結果#page#平衡質量與性能使用與光柵化混合染的模式(HYBRID)混合光追陰影染”使用傳統的ShadowMapping使用光追漳染ContactShadow使用很短的光線(1m)來探測可見性混
21、合兩者的結果僅對重要的光源做此操作#page#平衡質量與性能保持光線追蹤處理過程中的一致性(COHERENCY)代碼的一致性”相同的Hit/MissShader內存訪問的一致性頂點數據貼圖數量貼圖坐標高效且沒有噪點以光滑鏡面的反射為例#page#平衡質量與性能產生非一致性(INCOHERENCY)的原因相鄰的光線奔向不同的目的地效率降低”需要隨機采樣,產生噪點以粗糙表面的反射為例#page#平衡質量與性能如何減少非一致性(INCOHERENCY)把通用代碼移出Hit/MissShader統一或簡化不同材質的著色計算使用更高的Mip層級根據光線的分布和交點距離來調節著色計算追蹤較短的光線,并使用
22、“Fallback”來處理Miss的情況使用一些造假的手段當作鏡面反射處理,根據粗糙度對結果進行模糊處理高效,無噪點,但是不夠真實,視需求而定#page#降噪器的設計在實施光線追蹤時就要充分考慮降噪問題選擇恰當的貼圖細節級別進行采樣把Specular,Diffuse和陰影的數據分開存放對Diffuse使用Lambertian進行計算對隨機變量做一定的控制重要性采樣等用球諧函數來存儲IndirectDiffuse的的數據#page#降噪器的設計降噪器的一般工作流程為降噪器提供所有可能的信息Depth,Normal,Albedo等BRDF需要的數據對于陰影降噪,提供燈光參數(半徑,位置,距離等)一
23、般流程如下,僅供參考TemporalFinalize denoisedSpatial blurPrepare noisy signalsignalaccumulation#page#降噪器的設計降噪器的一般工作流程(僅供參考)做小半徑的空間模糊(SpatialBlur)(GI)Clamp亮度以減少頻率的突變(反射,GI)TemporalFinalize denoisedPrepare noisy signalSpatial blursignalaccumulation#page#降噪器的設計降噪器的一般工作流程(僅供參考)遮擋檢測,對無遮擋的區域做歷史數據累加用有效頓的數量來控制數據插值的權重
24、accumulatedColor = lerp(previousAccumulatedColor, currentColor, 1/numberofvalidHistoryFrames)TemporalFinalize denoisedPrepare noisy signalSpatial blursignalaccumulation#page#降噪器的設計降噪器的一般工作流程(僅供參考)在世界坐標中采樣根據如下數據確定權重根據物體表面的相似度和距離(反射,GI),等等保存過濾后的數值,以為下一頓所用TemporalFinalize denoisedPrepare noisy signalSp
25、atial blursignalaccumulation#page#降噪器的設計降噪器的一般工作流程(僅供參考)應用BRDF(反射,GI)TemporalFinalize denoisedPrepare noisy signalSpatial bluraccumulationsignal#page#游戲引擎中的光線追蹤#page#游戲引擎中的光線追蹤UE4的NVIDIARTX-Dev分支系列NVIDIA在Github上發布的一系列UE4的分支https:/ Caustics目前基于rtx-dlss-4.25.3焦散效果水體焦散(WaterCaustics)半透明物體和高光物體的焦散(MeshCaustics)半透明彩色陰影(額外加成?。└晟频墓庾钒胪该髟菊_的霧化效果,水底全反射效果半分辯率光追半透明染ZnVDIIA#page#游戲引擎中的光線追蹤UE4的NVIDIARTX-Dev分支系列擁有更多新特性的實驗分支一-NVRTX_Caustics增強的混合光追半透明染允許光追半透明漳染和光柵化半透明漳染同時工作不參與光追泊染的半透明物體在光柵化中染解決了UE4打開光追半透明后,傳統粒子無法染的問題更高效和完善的光追全局光照染半透明物體在光追反射中的染#page#謝謝!NVIDIA