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

評論