999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Unity Shader石油泄漏現象模擬的研究

2020-07-15 05:04:26劉賢梅葛昊天
計算機技術與發展 2020年7期
關鍵詞:效果

劉賢梅,葛昊天,趙 婭

(東北石油大學 計算機與信息技術學院,黑龍江 大慶 163318)

0 引 言

近年來不斷發展成熟的虛擬現實技術(virtual reality),利用計算機圖形學、三維建模、多媒體等多種技術手段[1],可以在計算機上實現逼真的三維場景的渲染,為模擬石油生產過程中的意外情況,提高工人的突發情況應急處理能力,應急仿真系統應運而生。在模擬石油泄漏事故的應急仿真系統中,石油泄漏現象的流動效果的模擬具有重大意義。傳統的模擬方式以粒子系統為主,但是使用粒子系統時,隨著粒子數目的增加,需要的內存增加,運行速率也變得很慢。

隨著硬件設備的不斷發展,GPU(graphics processing unit,圖形處理單元)性能的大幅度提高,由于GPU的可編程著色器的存在,開發人員可以通過可編程著色器(Shader)[2],對頂點及像素進行靈活的處理,模擬出更多逼真的效果。2006年上海師范大學蘇蘊等人通過渲染流水線的可編程著色器的控制,完成對于室內光的各種形式(點光源、平行光源等)的真實感模擬[3]。2015年,海軍航空工程學院的王彥等人通過可編程著色器完成大面積動態海洋紅外視景仿真,提高了水流的真實感[4]。因此,針對石油泄漏的流動效果,可以采用可編程著色器(Shader)進行模擬,不僅能夠模擬出石油流動的效果,還不需要消耗很多內存,能夠一直保持一個較快的運行速率。

Unity是一個專業的游戲引擎,而Unity的著色器(Unity Shader)是對著色器上層的一個抽象,它負責將輸入的Mesh(網格)以指定的方式與輸入的貼圖或者顏色等組合作用,輸出紋理[5]。文中首先探討了著色器和著色器語言,并對Unity Shader的文件結構與分類進行探討,然后通過Unity Shader控制底層GPU中的可編程著色器,采用紋理切換方法與基于噪聲的方法對輸入的貼圖進行處理,模擬出石油流動的效果。

1 著色器

1.1 著色器與著色器語言

Shader,中文翻譯為“著色器”,其本質是作用于渲染流水線上的一段程序,能夠控制渲染流水線的特定階段進行計算,以達到目標效果。現代可編程渲染流水線的最大特點在于GPU內部硬件設計具有可編程性,可以通過程序控制GPU內部渲染流水線。GPU中的可編程結構,包括頂點著色器和片元著色器,即可以針對頂點和像素進行編程[6]。因此,可以在頂點和像素著色器中編寫具有不同功能的程序來處理輸入信息,使整個處理過程更具靈活性和可控性。

Shader的主流編程語言有HLSL、GLSL、CG。HLSL(high level Shader language)是微軟基于DirectX的語言,只能運行在Windows平臺上[7]。GLSL(OpenGL Shading language),是用在OpenGL中著色編程的語言,也是一門跨平臺的著色器語言。Cg語言(C for graphics)是為GPU編程設計的高級著色器語言,由NVIDIA公司開發[8],可作為片段程序鑲嵌在Unity Shader程序中。

1.2 Unity Shader

1.ShaderLab。

為了避免直接控制底層著色器,Unity提供一層抽象——Unity Shader,此外還提供了一種專門為Unity Shader服務的語言——ShaderLab。它是一種說明性的語言,使用了一些嵌套在花括號內部的語義,這些語義包含了渲染所需的數據,包括著色器所需的各種屬性[9]。而Unity會自動將ShaderLab文件編譯成控制GPU中各個著色器的代碼。

2.ShaderLab文件的結構。

一個ShaderLab的基礎文件結構如下所示:

Shader”ShaderName”

{

Properties{

//屬性

}

SubShader{

//顯卡A使用的著色器

}

SubShader{

//顯卡B使用的著色器

}

......

Fallback”VertexList”

}

對各個部分的釋義如下:

(1)Properties。

Properties語義塊中包含了一系列屬性,并且這些屬性會出現在材質面板中,定義方式通常如下:

_Name("Display Name",type)=defaultValue[{options}]

這些屬性的存在是為了能夠更好地調整材質的屬性,方便在著色器中訪問它們。“Display Name”是出現在材質面板上的名字,type是屬性的類型,常用的屬性類型如表1所示,defaultValue是指定的默認值。

表1 Properties語義塊支持的屬性類型

(2)SubShader。

一個Shader有多個SubShader。一個SubShader可理解為一個Shader的渲染方案。即SubShader是為了針對不同的渲染情況而編寫的。每個Shader至少1個SubShader。Unity會掃描所有的Unity Shader,然后選擇第一個能夠在目標平臺上運行的SubShader。SubShader語義塊中包含的定義如下:

SubShader

{

Pass{ }

}

一個SubShader是由Pass塊來執行的。每個Pass定義了一次完整的渲染流程。在Pass內,定義了輸入輸出結構體,在結構體中進行光照,法線與空間變換等的計算。

(3)FallBack。

在各個SubShader語義塊之后,會存在一個FallBack,它會規定最低級的Shader是哪一個。由于一段Shader有可能在不同等級的顯卡上運行,而顯卡的能力也是參差不齊的。所以,FallBack相當于留了一條“后路”,以保證若之前所有的SubShader都無法在當前的顯卡上運行,則運行FallBack所指定的Shader[10]。

1.3 Unity Shader的形式

(1)表面著色器。

表面著色器(surface Shader)是Unity創造的一種著色器代碼類型。它在本質上就是對頂點/片元著色器的封裝,省去了一些重復代碼編寫的工作量。也就是Unity在提供一個表面著色器之后,在背后仍然將它變為頂點片元著色器。但是相比于頂點/片元著色器,表面著色器更加簡潔,效率更高[11]。

(2)頂點/片元著色器。

相比于表面著色器,頂點/片元著色器(vertex/fragment Shader)更加復雜,但同時靈活性更高。可以根據自己當前的不同需求,編寫控制頂點著色器和片元著色器的代碼,對GPU渲染流水線中的可編程部分直接進行靈活的控制。

(3)固定函數著色器。

上述的兩種Shader都使用了可編程管線,而對于一些比較老舊的,不支持可編程管線著色器的設備,則需要使用固定函數著色器(fixed function Shader)來完成渲染[12],這些著色器往往只能完成一些比較簡單的效果,目前很少使用。

1.4 Unity Shader的使用方法

首先根據需求,選擇一種Unity Shader形式,編寫Shader著色程序。然后在工程中新建材質球,將上述寫好的著色器程序賦給材質球,并給材質球設置貼圖,作為著色器程序的輸入,最后將材質球附在物體模型上,就得到了目標效果[13]。

2 石油流動效果的實現

針對石油的泄漏現象,為模擬出石油流動時石油的主體部分,在3dsMax中制作出一個邊緣光滑,形狀不規則的物體,作為模擬石油流動的主體模型。石油主體模型在3dsMax中的截圖如圖1所示。

圖1 模型截圖

2.1 基于紋理切換的石油流動效果設計與實現

該方法實現石油流動效果采用的是表面著色器(surface Shader),規定了兩個偏移速度x,y,速度乘以隨時間變化的時間變量得到偏移量。對圖片進行偏移計算之后的點進行采樣,獲得偏移點的顏色值作為返回值輸出,以達到石油流動的效果。流程圖如圖2所示。

圖2 紋理切換流程

在Properties塊中,需要聲明貼圖與貼圖的x,y軸偏移速度。輸入的主紋理貼圖的格式是2D,而偏移速度為范圍在(0,100)之間的數值。

_WaterTex("水的紋理圖:",2D)="white" {}

_XSpeed("X軸方向的紋理滾動速度",:

Range(-10,10))=1

_YSpeed("Y軸方向的紋理滾動速度",:

Range(-10,10))=1

Properties塊結束后,需要在SubShader塊(渲染方案)中,嵌套CG代碼塊。首先,通過結構體Input,將模型頂點的uv值作為surf函數的輸入。在表面函數surf中,對貼圖進行計算。通過內置的時間變量_Time乘以x軸,y軸方向的偏移速度,得到偏移量,通過x軸偏移量與y軸偏移量的組合,得到偏移量scrolledUV,并與頂點的uv值相加得到偏移量,通過tex2D函數,對貼圖在偏移處進行采樣,得到偏移處的顏色值。由于偏移量隨時間改變而改變,因此,采樣得出的顏色值也會隨時間改變,這樣就類似于貼圖在進行運動,以實現流動的效果。

fixed xValue=_XSpeed*_Time;

fixed yValue=_YSpeed*_Time;

UV+=fixed2(xValue,yValue);

half4 c=tex2D(_WaterTex,UV);

o.Albedo=c.rgb;

2.2 基于紋理切換的石油流動效果展示

圖3為使用紋理切換方法在RenderDoc中截取的八幀圖像。

圖3 RenderDoc中的截圖(1)

使用上述方法模擬在場景中發生漏油的效果如圖4所示。

圖4 紋理切換方法模擬效果圖

2.3 基于噪聲的石油流動效果的設計與實現

使用上述方法能夠有效模擬出石油流動的效果,但是無法模擬出石油在光照下的反射與折射效果。因此,引入噪聲圖片,對噪聲進行采樣得到的隨機值,來實現貼圖的動態扭曲效果,以實現貼圖的反射折射效

果,提高模擬的真實感。

在圖形學中使用噪聲是為了把一些隨機變量引入到程序中,如火焰、地形、云朵的模擬等等都要使用隨機變量。在圖形學中稱這種噪聲為“白噪聲”(功率譜密度在整個頻域內均勻分布的噪聲)[14]。噪聲的基礎來自于隨機數,若屏幕上的每個像素點給一個0~1之間的隨機數來表示像素點的亮度[15],就能得到白噪聲紋理。因此可以通過對白噪聲圖片進行采樣以得到隨機數,完成對于石油反射折射效果的模擬。

該方法采用的是頂點/片元著色器。在該模擬中,對噪聲圖進行采樣,其中對采樣點設置時間變量,隨著時間不斷發生偏移,它提供的R值就會不停的變化,將R值再與頂點數據相加作為采樣點,對主貼圖進行采樣,將得到的顏色作為輸出,那么圖片就會出現動態的扭曲效果,就實現了想要的石油流動效果。

流程圖如圖5所示。

圖5 噪聲模擬流程

在Pass通道嵌套的CG代碼段中,首先對頂點著色器進行控制,在頂點階段主要完成兩個工作,包括把頂點坐標從模型空間轉換到裁剪空間,再使用紋理的屬性(_MainTex_ST.xy,_MainTex_ST.zw)對頂點坐標進行計算,得到該階段計算之后的紋理坐標。主要計算過程如下:

v2f vert(appdata v)

{ o.vertex=UnityObjectToClipPos(v.vertex);

o.uv=TRANSFORM_TEX(v.uv,_MainTex);

}

在片元著色器中,實現的是噪聲模擬方法的主體。首先設置時間變量乘以速度,得到偏移量,偏移量與頂點數據相加作為采樣點,對噪聲圖片進行采樣,得到rgb值,此時,將R值提出,作為隨機數,再與頂點數據相加,作為采樣點對主貼圖進行采樣,得到對應點的rgb值,作為返回值返回。圖片就會出現動態的扭曲效果,就實現了想要的石油流動效果。

fixed4 frag(v2f i):SV_Target{

fixed4 noise_col=tex2D(_NoiseTex,i.uv + fixed2(_Time.y*_XSpeed, 0));

fixed uOffset=noise_col.r;

fixed vOffset=noise_col.r;

fixed4 col=tex2D(_MainTex, i.uv+ _Intensity*fixed2(uOffset, vOffset));

UNITY_APPLY_FOG(i.fogCoord, col);}

2.4 基于噪聲的石油流動效果展示

圖6為使用上述方法模擬時在RenderDoc中截取的八幀圖像。

圖6 RenderDoc中的截圖(2)

使用上述方法模擬在場景中發生漏油的效果如圖7所示。

圖7 噪聲方法模擬效果圖

3 結束語

利用Unity Shader技術,模擬出石油的流動效果。首先對著色器進行簡單介紹,然后針對Unity Shader,探討ShaderLab的結構及其分類。通過ShaderLab的兩種形式—表面著色器和頂點/片元著色器,完成兩種石油流動效果的模擬。一種使用紋理切換方式,引入時間變量對貼圖進行采樣,實現貼圖運動效果;另一種對噪聲進行采樣,得到隨機數,通過該隨機值與頂點進行組合進行采樣,貼圖就會出現動態的扭曲效果,完成對石油流動效果的模擬。

猜你喜歡
效果
按摩效果確有理論依據
保濕噴霧大測評!效果最驚艷的才20塊!
好日子(2021年8期)2021-11-04 09:02:46
笑吧
迅速制造慢門虛化效果
創造逼真的長曝光虛化效果
四種去色效果超越傳統黑白照
抓住“瞬間性”效果
中華詩詞(2018年11期)2018-03-26 06:41:34
期末怎樣復習效果好
模擬百種唇妝效果
Coco薇(2016年8期)2016-10-09 02:11:50
3D—DSA與3D—CTA成像在顱內動脈瘤早期診斷中的應用效果比較
主站蜘蛛池模板: 欧美亚洲香蕉| 美女无遮挡免费视频网站| 怡春院欧美一区二区三区免费| 国产精品林美惠子在线观看| 午夜日b视频| 亚洲精品无码高潮喷水A| 亚洲第一区在线| 久热re国产手机在线观看| 天天综合网色| 日韩精品中文字幕一区三区| 国产欧美在线| 99久久精品视香蕉蕉| 日韩a在线观看免费观看| 成人免费网站久久久| 91成人在线观看| 国产福利免费在线观看| 欧美h在线观看| 国产毛片高清一级国语 | 免费国产一级 片内射老| 国产传媒一区二区三区四区五区| 99视频在线观看免费| 日韩精品免费一线在线观看| 手机永久AV在线播放| 国产激情无码一区二区三区免费| 国产sm重味一区二区三区| 亚洲男人天堂2020| 尤物亚洲最大AV无码网站| 71pao成人国产永久免费视频| 国产成人精品优优av| 天天躁夜夜躁狠狠躁图片| 亚洲天堂精品视频| 高清无码不卡视频| 2021国产乱人伦在线播放| 久久www视频| 国产精品护士| 欧美日韩另类国产| 国产亚洲视频播放9000| 亚洲va精品中文字幕| 一级做a爰片久久免费| 亚洲天堂久久久| 亚洲最大综合网| 久久频这里精品99香蕉久网址| 丝袜美女被出水视频一区| 亚洲欧美自拍一区| 欧美第九页| 亚洲精品少妇熟女| 自拍偷拍欧美日韩| 91精品国产自产91精品资源| 一级一毛片a级毛片| 久久精品国产精品一区二区| 永久天堂网Av| 亚洲一区二区三区麻豆| 亚洲三级片在线看| 伊人五月丁香综合AⅤ| 久久精品亚洲专区| 亚洲首页国产精品丝袜| 亚洲综合专区| 久久精品一卡日本电影| 午夜高清国产拍精品| 国产jizz| 国产综合色在线视频播放线视| 欧美亚洲香蕉| 夜夜操天天摸| 丰满少妇αⅴ无码区| 久久这里只精品热免费99| 久久久精品无码一二三区| 米奇精品一区二区三区| 成人在线不卡| 国产青青草视频| 99视频只有精品| 亚洲专区一区二区在线观看| 久久五月视频| 欧美性久久久久| 亚洲激情99| 99ri精品视频在线观看播放| 试看120秒男女啪啪免费| 熟妇人妻无乱码中文字幕真矢织江| 婷婷六月在线| 国产丝袜精品| 91青青草视频| 亚洲欧美日韩天堂| 国产午夜精品一区二区三|