unity3d游戲引擎立體渲染教程
534 2017-05-26
完美教室教程之立體渲染(VolumetricRendering)。這些技術(shù)能突破現(xiàn)代3D引擎只能渲染物體外殼的最大限制。立體渲染可以實(shí)現(xiàn)逼真的材質(zhì)與燈光進(jìn)行復(fù)雜的交互,例如霧、煙、水和玻璃。查看NMZ的PlasmaGlobe效果了解立體渲染的基本概念,如下圖:
誠然,這些技術(shù)本身并不復(fù)雜,但實(shí)現(xiàn)上圖效果需要非常多的步驟。本教程將為大家全面介紹以下概念:
第一篇:立體渲染。介紹立體渲染的概念以及在Unity中如何實(shí)現(xiàn)立體渲染。
第二篇:光線追蹤。文章著重說明如何實(shí)現(xiàn)距離輔助的光線追蹤,這是是渲染立體的事實(shí)性標(biāo)準(zhǔn)技術(shù)。
第三篇:表面著色。全面指引如何逼真地進(jìn)行立體著色。
第四篇:有向距離常一篇對(duì)于數(shù)學(xué)工具更深入的討論,讓我們能制作和組合任意幾何體。
本文將介紹立體渲染的基本概念,并以一個(gè)簡(jiǎn)單的著色器收尾,后續(xù)的文章將以此為基礎(chǔ)進(jìn)行迭代:
介紹
第一部分立體渲染
第二部分立體射線投射
第三部分固定步長(zhǎng)的立體光線追蹤
結(jié)論
介紹
在3D游戲引擎中,球體、立方體以及所有其它復(fù)雜的集合體都是由三角面片組成的。Unity采用的實(shí)時(shí)光照系統(tǒng)只能渲染平面。例如渲染球體,Unity僅繪制球體表面的三角形。盡管一些材質(zhì)是半透明的,也只繪制表面并將其顏色與后面的物體進(jìn)行混合。光照系統(tǒng)無法探測(cè)到材質(zhì)的幾何體的內(nèi)部。對(duì)于GPU來說,整個(gè)世界就是由各種空殼構(gòu)成的。
為了突破這種強(qiáng)大的限制,大量技術(shù)順勢(shì)而出。盡管傳統(tǒng)著色器最終都會(huì)止于物體表面,但這并不意味著無法更深入。立體渲染技術(shù)可以在材質(zhì)內(nèi)部模擬光線的傳送,從而實(shí)現(xiàn)更震撼也更真實(shí)的視覺效果。
立體渲染
無光照紋理的片段著色器如下:
fixed4frag(v2fi):SV_Target
{
fixed4col=tex2D(_MainTex,i.texcoord);
returncol;
}
不嚴(yán)格地說,上述代碼會(huì)為最終渲染圖像每一個(gè)可能的像素(片段)調(diào)用。GPU會(huì)在有三角形與相機(jī)視錐體相交時(shí),調(diào)用該片段著色器。換句話說,就是相機(jī)“看見了”該對(duì)象。Unity需要知道該對(duì)象的實(shí)際顏色,以便將其分配到渲染圖像的各個(gè)像素。
片段著色器最后返回的對(duì)象,是從特定角度看過去特定位置的顏色。這種方式計(jì)算的顏色是完全隨意的,因此返回的內(nèi)容可以不必匹配幾何體的真實(shí)渲染情況。下圖展示了一個(gè)3D立方體的例子。當(dāng)片段著色器檢測(cè)到立方體表面的顏色時(shí),我們獲得的顏色如同我們?cè)谝粋€(gè)球體上所看到的。這個(gè)幾何體是個(gè)立方體,但是從相機(jī)的角度來看,它的外觀和感覺其實(shí)“酷似”一個(gè)球體。
這就是立體渲染(VolumetricRendering)的基本概念:模擬光線在物體內(nèi)部的傳送。
如果想模擬前面的效果,就要更精確地進(jìn)行描述。假設(shè)主物體是一個(gè)立方體,要在其內(nèi)部立體渲染一個(gè)球體,實(shí)際上并不存在這個(gè)球體,因?yàn)槲覀儗⑼耆ㄟ^著色器代碼來渲染。球體中心點(diǎn)位于_Centre,半徑是_Radius,均為世界坐標(biāo)。移動(dòng)立方體不會(huì)影響球體位置,因?yàn)樗峭耆允澜缱鴺?biāo)系來表述的。外部的幾何體也不會(huì)對(duì)該球體造成任何影響。立方體表面的三角形就是通向幾何體內(nèi)部的窗口。雖然可以使用四邊形(Quad)減少三角形數(shù)量,但要能從立方體的任意角度觀看該球體。
立體射線投射
第一種立體渲染的方式完全適用于實(shí)現(xiàn)前文所述的效果。片段著色器接收要渲染的點(diǎn)(wolrdPosition)以及視線方向(viewDirection),然后使用raycastHit函數(shù)檢測(cè)是否投射到紅色球體。這種技術(shù)叫做立體射線投射(VolumetricRaycasting),它將射線從相機(jī)投射到幾何體內(nèi)部。
在片段著色器函數(shù)中添加剩下的代碼:
float3_Centre;
float_Radius;
fixed4frag(v2fi):SV_Target
{
float3worldPosition=...
float3viewDirection=...
if(raycastHit(worldPosition,viewDirection))
returnfixed4(1,0,0,1);//Redifhittheball
else
returnfixed4(1,1,1,1);//Whiteotherwise
}
下面來解釋代碼中的其它變量。
世界坐標(biāo)
首先,片段的世界坐標(biāo)就是從相機(jī)生成的射線投射到幾何體上的點(diǎn)。在片段著色器中獲取世界坐標(biāo)的代碼如下:
structv2f{
float4pos:SV_POSITION;//Clipspace
float3wPos:TEXCOORD1;//Worldposition
};
v2fvert(appdata_fullv)
{
v2fo;
o.pos=mul(UNITY_MATRIX_MVP,v.vertex);
o.wPos=mul(_Object2World,v.vertex).xyz;
returno;
}
視線方向
其次,視線方向就是射線從相機(jī)投射到幾何體上被渲染的點(diǎn)的方向。這里需要知道相機(jī)坐標(biāo),Unity已內(nèi)置了該變量_WorldSpaceCameraPos。計(jì)算通過兩點(diǎn)的射線方向可使用如下代碼:
float3viewDirection=normalize(i.wPos-_WorldSpaceCameraPos);
RaycastHit函數(shù)
當(dāng)我們知道了渲染點(diǎn)的坐標(biāo)和方向后,現(xiàn)在需要使用raycastHit函數(shù)來決定射線是否投射到了虛擬的紅色球體上。這就是球體與線段相交的問題,這種問題已有慣用解決方案,但通常效率不高。如果需要更具分析性的方法,就需要自行解決線段與自定義幾何體相交的問題。這種方案極大限制了可以創(chuàng)建的模型,所以很少被應(yīng)用。
固定步長(zhǎng)的立體光線追蹤
上面提到純分析式的立體射線投射,其實(shí)不適合解決這里的問題。如果希望模擬任意幾何體,就要找到不依賴于相交方程的更為靈活的技術(shù)。常見的解決方案叫做立體光線追蹤(VolumetricRaymarching),是基于迭代的解決方案。
立體光線追蹤會(huì)緩慢地將射線投射到立方體內(nèi),每一步都會(huì)檢測(cè)當(dāng)前是否已投射到紅色球體。
每條射線均從片段坐標(biāo)worldPosition開始,然后迭代沿著viewDirection的方向投射STEP_SIZE單位長(zhǎng)度。這可以通過每次迭代為worldPosition加上STEP_SIZE*viewDirection來實(shí)現(xiàn)。
用下面的raymarchHit函數(shù)代替之前的raycastHit:
#defineSTEPS64
#defineSTEP_SIZE0.01
boolraymarchHit(float3position,float3direction)
{
for(inti=0;i { if(sphereHit(position)) returntrue; position+=direction*STEP_SIZE; } returnfalse; } 下面的函數(shù)用于檢測(cè)點(diǎn)p是否位于球體內(nèi): boolsphereHit(float3p) { returndistance(p,_Centre)<_Radius; } 線段與球體相交很難,但迭代檢測(cè)點(diǎn)是否位于球體內(nèi)就很簡(jiǎn)單了。結(jié)果見下圖,別看它看起來就是個(gè)圓形,實(shí)際上這就是個(gè)無光照的球體:
結(jié)論
本文介紹了基本的立體渲染概念。盡管傳統(tǒng)著色器只能渲染材質(zhì)的外殼,但還是有辦法讓光線穿透到材質(zhì)內(nèi)部的幾何體,創(chuàng)造畫面的深度。光線追蹤就是最常用的技術(shù),本文用該技術(shù)在立方體內(nèi)繪制了一個(gè)紅色球體。后面的教程將分享如何逼真地著色(第三篇表面著色)以及如何做出一些有趣的形狀(第四篇有向距離場(chǎng))。最終將能夠使用簡(jiǎn)單幾行代碼和一個(gè)立體渲染著色器實(shí)現(xiàn)如下效果:
請(qǐng)聯(lián)系網(wǎng)站客服,了解詳細(xì)的優(yōu)惠課程信息~
優(yōu)質(zhì)、權(quán)威、便捷、省心
掃一掃
獲取更多福利
獵學(xué)網(wǎng)企業(yè)微信
獵學(xué)網(wǎng)訂閱號(hào)
獵學(xué)網(wǎng)服務(wù)號(hào)