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