光線追蹤與光柵化
自20世紀90年代以來,傳統的3D渲染通常使用稱為光柵化的過程。柵格化使用從三角形或多邊形網格創建的對象來表示對象的3D模型。渲染管線然后將3D模型的每個三角形轉換成2D圖像平面上的像素。這些像素然后可以在屏幕上的最終顯示之前被進一步處理或“著色”。雖然光柵化對于實時生成圖像非常有效,但為光柵化管線添加逼真的光照效果會增加復雜性,需要基于給定場景的許多手動調整參數。保持良好的表現通常需要使用可能影響整體現實的捷徑或估計。光線追蹤是實現更大現實的重要一步。
光線追蹤通過模擬光線的物理行為生成高度逼真的圖像。光線追蹤通過追蹤光線從觀看者的眼睛穿過虛擬3D場景的路徑來計算像素的顏色。光線可能會從一個物體反射到另一個物體(引起反射),被物體阻擋(引起陰影),或穿過透明或半透明物體(模擬半透明或電介質,如玻璃或水)穿過場景。所有這些交互結合起來產生屏幕上顯示的像素的最終顏色。如圖1所示,保真度可以保持不變,算法可以優雅地實施,但需要大量復雜的計算工作量。
圖1. Enrico Cerica使用OctaneRender生成的計算機生成的圖像顯示了復雜地板表面上的光線追蹤陰影和反射
光線追蹤如何工作
光線追蹤直接模擬穿過虛擬環境的光線。圖2顯示了環境如何由相機,燈光集合,3D幾何模型以及這些模型的材質描述組成。然后追蹤表示光路或光子的光線,以確定相機傳感器在給定方向上看到的光線值。追蹤射線通常遵循一系列自然事件:
-
創建代表從環境到相機的光路反向的光線。
-
射線與場景相交,確定射線擊中哪個物體,如果有的話。
-
材質著色器或環境著色器計算照明值沿著光線的路徑
-
最后,產生的光照值被寫入幀緩沖器。
圖2.簡化的光線追蹤圖
第3步通常是通過產生額外的光線來確定入射光在物體上某一點上的位置,從而使光線追蹤自然遞歸算法。
光線跟蹤在GPU上
創建真實照片般逼真的圖像的能力是為什么光線追蹤被視為計算機渲染的未來。今天的光線追蹤渲染器主宰虛擬效果制作和動畫特效。大規模并行GPU的出現現在擴展了可以使用光線追蹤的領域空間。使用GPU的離線渲染現在需要幾分鐘的時間,而不是使用主流CPU所需的時間。NVIDIA?(英偉達?)GPU搭配NVIDIA先進的光線追蹤技術堆棧,現在提供了計算能力和軟件框架,可在消費者級工作站上執行有趣的實時光線追蹤工作負載。
NVIDIA在本周在GTC上宣布支持新款Quadro?GV100上的RTX技術。開發人員可以通過多種API訪問NVIDIA RTX技術,具體取決于他們的需求和開發環境,如圖3所示。
圖3. NVIDIA RTX技術
-
微軟的DirectX光線追蹤(DXR)API。將光線追蹤功能完全集成到游戲開發人員使用的行業標準API DirectX中,使光線追蹤成為光柵化和計算的替代品,而不是光柵追蹤的替代品。DXR專注于通過混合光柵化光線追蹤技術啟用實時用例。
-
NVIDIA的Vulkan Ray追蹤擴展。即將推出;可以對Vulkan圖形標準進行光線追蹤擴展。另一種在跨平臺API中緊密耦合光線跟蹤和光柵化技術的途徑。
-
NVIDIA的OptiX API。用于在GPU上實現高性能光線追蹤的應用程序框架。它為加速光線追蹤算法提供了一個簡單的,遞歸的和靈活的流水線。OptiX SDK包含兩個可以彼此獨立使用的主要組件:用于渲染器開發的光線跟蹤引擎和用于顯示之前的圖像處理的后處理管道。
所有這三種API共享一種描述光線追蹤操作的通用方法,使得開發人員可以直接在多個平臺上訪問RTX。十年來在渲染軟件和硬件方面的投資已經導致高度優化的光線追蹤解決方案,實現了以前達不到的性能和交互性水平。NVIDIA還大量投資開發工具鏈,使得GPU編程,調試和分析比以往更容易。
有關DXR的更多信息,請查看關于該主題的博客文章。今年的GTC會議S8521上提供了Vulkan擴展的預覽版。現在我們來看看OptiX API。
圖4.光線追蹤在概念上簡單,計算復雜
NVIDIA設計了OptiX API來填補NVIDIA GPU上簡單的概念模型和相對高級的執行模型之間的差距,使開發人員可以專注于他們的核心光線追蹤算法,如圖5所示。OptiX建立在關鍵的觀察中,即大多數射線追蹤算法可以使用一小組可編程操作來實現。OptiX提供了一個描述虛擬環境的API和一組用戶可編程著色器來實現射線跟蹤周期的每個階段。
圖5. OptiX中的用戶可編程著色器顯示為綠色。橫向由OptiX內部控制。
OptiX的核心是一個領域特定的即時編譯器。編譯器通過結合用戶提供的射線生成,材質著色,對象交叉和場景遍歷的程序來生成自定義光線跟蹤內核。高性能是通過使用緊湊的對象模型和光線跟蹤編譯器優化實現的,可以有效地映射到新的RTX技術和Volta GPU。
OptiX支持各種各樣的用例,包括交互式渲染,批量渲染,碰撞檢測系統,人工智能查詢以及聲音傳播或中子傳輸等科學仿真。OptiX已被集成到各種當前可用的商業軟件產品中,并且已經成為近十年來的關鍵光線追蹤SDK。
使用OptiX的主要優點包括:
-
可編程的GPU加速射線跟蹤管線,可根據您的應用需求輕松定制
-
單線程編程模型提供對遞歸的全面支持和類似于虛擬函數調用的動態調度機制
-
最先進的數據結構,用于極快的光線對象交叉
-
支持渲染大型場景,透過跨多個GPU進行透明縮放,以及通過NVLink自動組合多個GPU內存
-
OptiX利用最新的GPU架構特性,無需進行應用方面的更改
-
一種基于AI的去噪器,用于改善用戶實時探索的體驗
-
靈活性支持任意著色模型,包括基于物理的MDL材料規范的示例實現
-
全面的編程指南,參考文檔和示例可幫助您將OptiX快速集成到您的應用程序中
-
NVIDIA?(英偉達?)RTX技術的直觀界面以及Volta GPU的強大功能
光線生成程序
射線路徑中的第一個射線段,通常稱為主射線,使用射線生成程序。這跟蹤場景中的射線,將追蹤結果寫入輸出緩沖區。下面是一個非常簡單的示例射線生成程序。
//用戶可以定義一個任意結構來攜帶與射線相關的數據//并從曲線返回值。structPerRayData{ float4result;//結果的輸出變量。我們可以根據需要跟蹤其他信息。}; rtDeclareVariable(CameraParams,camera_params,,);//輸入描述//相機型號的參數。rtDeclareVariable(rtObject,scene_root_group,,);//頂級組//包含場景描述。rtBufferoutput_buffer;//輸出緩沖區來存儲渲染的圖像。 rtDeclareVariable(uint2,launch_index,rtLaunchIndex,);//OptiX內置變量,包含當前索引到啟動網格中。//通常這對應于輸出圖像中的像素索引。rtDeclareVariable(uint2,launch_dim,rtLaunchDim,);//OptiX內置變量,包含發射網格的大小。通常//這對應于輸出圖像的維數。 RT_PROGRAMvoidpinhole_camera(){//通過針孔相機建模來創建主光線。或者,我們可以讀取//從輸入緩沖區預先生成的光線或使用其他方法。constfloat3ray_origin=pinholeCameraGetOrigin(camera_params);Constfloat3ray_direction=pinholeCameraComputeDirection(camera_params,launch_index, launch_dim); optix::Rayray=optix ::make_Ray( ray_origin,//攝像頭位置 ray_direction,//從原點到屏幕平面0u上像素位置的方向,//射線類型(請參閱文檔) scene_epsilon,//最小相交距離 RT_DEFAULT_MAX);//最大交叉距離 //初始化我們的射線數據結構并調用內置函數rtTracePerRayDataprd;Prd。result=make_float4(0.0f); rtTrace(top_object,ray,prd); //將結果寫入緩沖區。啟動完成后,此輸出緩沖區通常//被拖動到屏幕上或寫入圖像文件。 output_buffer[launch_index]=prd。結果;
場景遍歷程序
OptiX利用最先進的空間分區層次數據結構,可以非常快速地剔除虛擬場景中不與給定射線相交的部分。Optix核心編譯器控制這些數據結構的創建和遍歷。這使得OptiX可以隱藏高度優化的,特定于架構的實現的復雜性,并將多年的NVIDIA研究成果用于遍歷加速結構。
相交和邊界框程序
可以使用用戶定義的相交和邊界框程序來實現自定義基元,如球體,曲線或細分修補程序。邊界框程序必須計算自定義基元的對象空間軸對齊邊界框。根據輸入射線是否與基元相交,交集程序返回true或false。下面是每種類型的程序的簡單示例,演示如何實現球體基元。
rtDeclareVariable(個float4,球體,,);//輸入變量給球體中心,半徑rtDeclareVariable(float3,normal,attributenormal,);//屬性變量允許從交集//程序到命中程序的數據傳遞 rtDeclareVariable(optix::Ray,ray,rtCurrentRay,);//OptiX提供的內置變量RT_PROGRAMvoidintersect_sphere(){ float3center=make_float3(sphere);//提取球體的中心位置floatradius=sphere。w;//提取球體的半徑 float3n;//表面法線的輸出參數floatt;//相交距離的輸出參數 if(intersect_sphere(ray,center,radius,n,t))//確定射線是否碰到球體,如果是,//距離多遠{if(rtPotentialIntersection(t))//告訴OptiX射線與其相交球體。OptiX//將檢查相交距離是否位于//當前有效射線間隔內,并相應地返回true/false//。 { normal=n;//輸出屬性總是寫入//rtPotentialIntersection和rtReportIntersection之間 constintmaterial_id=0; rtReportIntersection(material_id);//報告具有物料ID的交集}}} //為多原始幾何體(例如三角網格)使用原始索引RT_PROGRAMvoidbounds(int/*primitive_index*/,floatresult[6]){constfloat3center=make_float3(sphere);常量浮子半徑=make_float3(球體。瓦特); optix::Aabb*aabb=(optix::Aabb*)結果;//將float數組轉換為輔助數據類型以便于使用 aabb->m_min=center-make_float3(radius); aabb->m_max=center+make_float3(radius);}
最近擊和任意擊中程序
最接近的和任意命中的程序一起工作以作為材質著色器。OptiX允許開發人員指定一種或多種類型的光線(例如,輻射,環境遮擋或陰影光線)。材質可以指定最接近的命中和任意命中程序來描述每個光線類型的對象相交時的著色行為。命中程序通過屬性變量從交集程序接收信息。他們通過寫入光線有效載荷將信息傳遞回光線生成程序。
當光線跟蹤核心完全穿越場景并找到當前光線有效距離區間內最接近的交點時,將調用最近擊的程序。最終著色通常發生在這個階段。一個全功能的陰影系統可能會評估基于物理的反射函數并生成二次光線來評估反射,折射和光線遮擋。
在遍歷場景時發現新的可能最接近的對象時,任何命中的程序都會被調用。任何命中的程序都可以對當前的潛在交叉點采取以下三種操作之一:
-
通過調用可以忽略交集rtIgnoreIntersection。這可以在諸如透明alpha剪切的情況下拒絕交叉。
-
射線遍歷可以通過調用來終止rtTerminateRay。這通常用于點對點可見性測試,因為在點之間找到的任何對象都是足夠的。
-
交叉點可以被接受,但是遍歷是繼續的。如果沒有rtIgnoreIntersection或被rtTerminateRay調用,這是默認行為。
對于任何給定的物質射線類型的插槽,任何命中或最近命中的程序都可以不受約束。例如,一個不透明的材質可能只需要一個任意點擊的陰影射線程序,因為找到光線和陰影點之間的任何交點就足以確定一個點在陰影中。另一方面,不透明材料通常只有一個最受歡迎的程序用于輻射射線。
下面是一個非常簡單的一對非常簡單的不透明材料擊中程序的例子,通過簡單地查看它們的表面法線來遮蔽物體。
//通常,任何命中和最近命中的程序都使用不同的光線有效載荷結構,具體取決于他們想要返回到光線生成程序的數據。為了簡單起見,我們將使用單一類型。structPerRayData{ float4result;//任意擊中的最接近命中的光輝值,不透明度};rtDeclareVariable(PerRayData,prd,rtPayload,);//內置提供對這個ray有效載荷的訪問structrtDeclareVariable(float3,normal,attributenormal,);//我們的交集程序指定的屬性RT_PROGRAMvoidnormal_shader_closest_hit_radiance(){//將對象normal轉換為世界空間并轉換為顏色constfloat3world_space_normal=optix::normalize(rtTransformNormal(RT_OBJECT_TO_WORLD,normal));Constfloat3color_normal=world_space_normal*0.5f+0.5f; prd。result=make_float4(color_normal,1.0f);} RT_PROGRAMvoidnormal_shader_any_hit_shadow(){//這個材質是不透明的,所以它完全衰減了所有的陰影射線 prd_shadow。result=make_float3(0.0f); //我們終止這條射線,因為我們只想知道是否有幾何體被擊中,而不是最接近的 rtTerminateRay();}
小姐節目
如果沒有幾何體被射線擊中,則調用未命中程序。可以為每個光線類型指定一個未命中程序,并且可以保持未綁定狀態。小姐程序用于實現環境地圖或無限遠的背景。下面是一個實現用戶可指定的常量彩色背景環境的程序。
structPerRayData{ float4result;//任意擊中的最接近命中的光輝值,不透明度};rtDeclareVariable(個float4,bg_color,,);//輸入背景顏色的變量rtDeclareVariable(PerRayData,prd,rtPayload,);//內置提供對這個射線的有效載荷結構的訪問RT_PROGRAMvoidmiss(){ prd_radiance。結果=bg_color;}
性能
OptiX在一系列NVIDIA GPU上運行,但使用Volta GPU實現最佳性能,如圖6所示。
圖6. NVIDIA GPU上的OptiX性能
使用NVIDIA OptiX增強創意
使用NVIDIA OptiX的渲染軟件(例如Autodesk Arnold,Chaos Group V-Ray,Isotropix Clarisse,Optis,Pixar RenderMan和Solidworks Visualize)將在NVIDIA Volta架構上運行時自動使用RTX技術。
OptiX AI降噪技術與Quadro GV100和Titan V中新的NVIDIA Tensor Cores相結合,可提供前代GPU性能的3倍,并首次實現無噪聲流體交互。
NVIDIA正在改變渲染以及整個設計過程。借助NVIDIA Volta GPU和NVIDIA?RTX?光線追蹤技術,您可以通過實時的電影質量渲染提高創造力,從而獲得更好的效果并立即做出決策。與您的客戶在房間中探索設計,在照片和材料上進行實驗,從而以交互方式精確模擬真實世界的照明條件。
-
NVIDIA
+關注
關注
14文章
4986瀏覽量
103058 -
gpu
+關注
關注
28文章
4740瀏覽量
128949 -
光線追蹤
+關注
關注
0文章
183瀏覽量
21478
發布評論請先 登錄
相關推薦
評論