• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于Unity Shader石油泄漏現(xiàn)象模擬的研究

      2020-07-15 05:04:26劉賢梅葛昊天
      計算機技術(shù)與發(fā)展 2020年7期
      關(guān)鍵詞:著色器模擬出偏移量

      劉賢梅,葛昊天,趙 婭

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

      0 引 言

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

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

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

      1 著色器

      1.1 著色器與著色器語言

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

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

      1.2 Unity Shader

      1.ShaderLab。

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

      2.ShaderLab文件的結(jié)構(gòu)。

      一個ShaderLab的基礎(chǔ)文件結(jié)構(gòu)如下所示:

      Shader”ShaderName”

      {

      Properties{

      //屬性

      }

      SubShader{

      //顯卡A使用的著色器

      }

      SubShader{

      //顯卡B使用的著色器

      }

      ......

      Fallback”VertexList”

      }

      對各個部分的釋義如下:

      (1)Properties。

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

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

      這些屬性的存在是為了能夠更好地調(diào)整材質(zhì)的屬性,方便在著色器中訪問它們?!癉isplay Name”是出現(xiàn)在材質(zhì)面板上的名字,type是屬性的類型,常用的屬性類型如表1所示,defaultValue是指定的默認值。

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

      (2)SubShader。

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

      SubShader

      {

      Pass{ }

      }

      一個SubShader是由Pass塊來執(zhí)行的。每個Pass定義了一次完整的渲染流程。在Pass內(nèi),定義了輸入輸出結(jié)構(gòu)體,在結(jié)構(gòu)體中進行光照,法線與空間變換等的計算。

      (3)FallBack。

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

      1.3 Unity Shader的形式

      (1)表面著色器。

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

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

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

      (3)固定函數(shù)著色器。

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

      1.4 Unity Shader的使用方法

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

      2 石油流動效果的實現(xiàn)

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

      圖1 模型截圖

      2.1 基于紋理切換的石油流動效果設(shè)計與實現(xiàn)

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

      圖2 紋理切換流程

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

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

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

      Range(-10,10))=1

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

      Range(-10,10))=1

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

      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)

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

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

      2.3 基于噪聲的石油流動效果的設(shè)計與實現(xiàn)

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

      果,提高模擬的真實感。

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

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

      流程圖如圖5所示。

      圖5 噪聲模擬流程

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

      v2f vert(appdata v)

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

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

      }

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

      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)

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

      圖7 噪聲方法模擬效果圖

      3 結(jié)束語

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

      猜你喜歡
      著色器模擬出偏移量
      基于格網(wǎng)坐標轉(zhuǎn)換法的矢量數(shù)據(jù)脫密方法研究
      基于UE4 實時射線追蹤技術(shù)的研究與探討
      基于IMx6的opengl圖形著色器開發(fā)研究
      中國新通信(2020年2期)2020-06-24 03:06:44
      基于Unity3D的水面波浪模擬
      春 夜
      科教新報(2019年12期)2019-09-10 06:54:57
      攪拌針不同偏移量對6082-T6鋁合金接頭勞性能的影響
      基于最小二乘平差的全極化SAR配準偏移量估計方法
      測繪工程(2017年3期)2017-12-22 03:24:50
      放射夕陽之光
      中華手工(2016年4期)2016-04-20 03:10:35
      聲音從哪里來
      好孩子畫報(2014年2期)2014-03-07 21:57:37
      能模擬真實天氣的可視化預(yù)報器
      大眾健康(2014年12期)2014-01-19 03:15:54
      佛学| 建德市| 泰州市| 庆安县| 冀州市| 通江县| 德惠市| 江津市| 科技| 东丰县| 神农架林区| 调兵山市| 商水县| 清新县| 托里县| 开封市| 兴安县| 德格县| 鹤山市| 大港区| 波密县| 洪江市| 扬中市| 特克斯县| 东阿县| 灌云县| 勃利县| 亚东县| 磐安县| 利川市| 滨海县| 布尔津县| 前郭尔| 万年县| 普定县| 西青区| 沂源县| 柳江县| 大荔县| 雷波县| 通化市|