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

基于U3D和Shader下模型光束效果的設(shè)計(jì)與實(shí)現(xiàn)

2023-07-26 09:13:38陳翔宇
電腦知識(shí)與技術(shù) 2023年16期
關(guān)鍵詞:效果模型

陳翔宇

(華東師范大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,上海200333)

0 引言

Unity是實(shí)時(shí)3D互動(dòng)內(nèi)容創(chuàng)作和運(yùn)營平臺(tái)。包括游戲開發(fā)、美術(shù)、建筑、汽車設(shè)計(jì)、影視在內(nèi)的所有創(chuàng)作者,借助Unity將創(chuàng)意變成現(xiàn)實(shí)[1]。Unity平臺(tái)提供一整套完善的軟件解決方案,可用于創(chuàng)作、運(yùn)營和變現(xiàn)任何實(shí)時(shí)互動(dòng)的2D 和3D 內(nèi)容,支持包括手機(jī)、平板電腦、PC、游戲主機(jī)、增強(qiáng)現(xiàn)實(shí)和虛擬現(xiàn)實(shí)設(shè)備,同時(shí)支持Windows、Android和Mac等多平臺(tái)[2]。

Unity3D 開發(fā)相比于其他游戲引擎,有更多優(yōu)勢特點(diǎn):1) 支持多種格式導(dǎo)入:整合多種DCC文件格式,包含3dsMax、Maya、Lightwave、Collade 等文檔,可直接拖拽到Unity中,除原有內(nèi)容外,還包含Mesh、多UVs、Vertex、Colors、骨骼動(dòng)畫等功能,提升游戲制作的資源應(yīng)用[3]。2) 逼真的粒子系統(tǒng):Unity 開發(fā)的游戲可以達(dá)到難以置信的運(yùn)行速度,在良好硬件設(shè)備下,每秒可以運(yùn)算數(shù)百萬面以上的多邊形。高質(zhì)量的粒子系統(tǒng),內(nèi)置的Shuriken 粒子系統(tǒng),可以控制粒子顏色、大小及粒子運(yùn)動(dòng)軌跡,可以快速創(chuàng)建下雨、火焰、灰塵、爆炸、煙花等效果。3) 支持外源制作的各種插件,導(dǎo)入U(xiǎn)nity 后方便制作者使用。4) 支持多平臺(tái)發(fā)布:Unity3D 游戲開發(fā)支持的平臺(tái),無疑是當(dāng)下較為流行的平臺(tái),滿足絕大部分項(xiàng)目需求。早期的引擎,多以PC 和CONSOLE 為主[4],同時(shí)支持了Windows、XBOX、PS2 等平臺(tái)。U3D 便利的多平臺(tái)發(fā)布特性,也是它成為當(dāng)前性價(jià)比最高的引擎的原因之一。5) AssetStore商店提供了大量的資源,使U3D的生態(tài)圈更加穩(wěn)固[5]。用戶可以制作插件網(wǎng)上售賣,賺取一些利益,也可以購買別人的插件,作為使用或者參考。有時(shí)候,購買一些插件,可以讓用戶快速脫離當(dāng)前的困境,一個(gè)是解決進(jìn)度問題,一個(gè)是解決思路問題,這是之前其他引擎不具備的。

1 Shader下光束的設(shè)計(jì)

1.1 Shader原理

Shader 是運(yùn)行在GPU 上可編程的圖形程序,在Unity 中可以使用Cg/HLSL 語言編寫頂點(diǎn)著色器和片元著色器。頂點(diǎn)著色器和片元著色器被分離為可編程的單元,兩者都擁有強(qiáng)大的并行計(jì)算能力,擅長于矩陣計(jì)算(不高于四階),片元著色器可以高速查詢紋理數(shù)據(jù)信息,但頂點(diǎn)著色器不行[6]。頂點(diǎn)著色器(Vert)負(fù)責(zé)處理頂點(diǎn)坐標(biāo)轉(zhuǎn)換信息,片元著色器(Frag)負(fù)責(zé)處理像素顏色數(shù)據(jù)計(jì)算信息,且前者的輸出是后者的輸入。頂點(diǎn)著色程序從GPU 前端模塊(寄存器)中提取圖元信息(頂點(diǎn)位置、法向量、紋理坐標(biāo)等),并完成頂點(diǎn)坐標(biāo)空間轉(zhuǎn)換、法向量空間轉(zhuǎn)換、光照計(jì)算等操作,最后將計(jì)算好的數(shù)據(jù)傳送到指定寄存器中;然后片元著色程序從中獲取需要的數(shù)據(jù),通常為紋理坐標(biāo)、光照信息等,并根據(jù)這些信息以及從應(yīng)用程序傳遞的紋理信息(如果有)進(jìn)行每個(gè)片元的顏色計(jì)算,最后將處理后的數(shù)據(jù)送光柵操作模塊[7]。片元著色程序?qū)γ總€(gè)片元進(jìn)行獨(dú)立的顏色計(jì)算,最后輸出顏色值的就是該片段最終顯示的顏色,具體渲染流程見圖1。

圖1 Shader渲染流程

1.2 Shaderlab編程開發(fā)的結(jié)構(gòu)

ShaderLab 開發(fā)是Unity 內(nèi)置的一段Shader 代碼,在Unity 中賦予材質(zhì)上的Shader 著色器進(jìn)而實(shí)現(xiàn)效果。內(nèi)部結(jié)構(gòu)偏復(fù)雜,詳細(xì)闡述易于理解。

1) Properties{}:Properties的{}內(nèi)是定義著色器的相關(guān)屬性,輸入的屬性會(huì)呈現(xiàn)在Unity平臺(tái)內(nèi)Material下的Inspector 面板下供調(diào)試,定義格式為_Name(“Inspector Name”,type)=Value[option}],其中_Name 表示屬性名,有_NormalMap、_MainTex、_Color、_BumpScale等。”Inspector Name”代表在Inspector面板下顯示的屬性名。“Type”則是屬性類型(Vector、Float、Range(min,max)、Cube、Rect、2D、Color等);Properties面板見圖2。

圖2 Shader下Properties面板

2) SubShader{},SubShader 是子Shader,可以有多個(gè),運(yùn)行效果時(shí),從第一個(gè)SubShader開始[8],如果第一個(gè)SubShader的效果都可以實(shí)現(xiàn),就使用第一個(gè),如果不可以,就會(huì)自動(dòng)運(yùn)行下一個(gè)SubShader,直到最后的Fallback回滾;

3) pass 塊,隸屬于SubShader 中,一個(gè)pass 塊相當(dāng)于一個(gè)方法,在它內(nèi)部的CGPROGRAM 至ENDCG 區(qū)域編寫Shaderlab代碼;

4) CGPROGRAM 到ENDCG 部分,這個(gè)區(qū)域是Shaderlab 代碼的核心內(nèi)容,必須將屬性塊Properties里需要的屬性值重新定義一遍。區(qū)域的主要內(nèi)容再細(xì)分為:①#pragram vertex vert,聲明頂點(diǎn)函數(shù),頂點(diǎn)函數(shù)名為vert,它的基本作用是完成頂點(diǎn)坐標(biāo)從模型空間到剪裁空間的轉(zhuǎn)換(從游戲環(huán)境轉(zhuǎn)換到視野相機(jī)屏幕上)。②#pragram fragment frag,聲明片元函數(shù),它的基本作用是返回模型對(duì)應(yīng)的屏幕上每一個(gè)像素的顏色值[9]。③struct a2v,從應(yīng)用程序傳遞到頂點(diǎn)函數(shù)的結(jié)構(gòu)體。④struct v2f,從頂點(diǎn)函數(shù)傳遞給片元函數(shù)的結(jié)構(gòu)體。⑤v2f vert(a2v v),即頂點(diǎn)函數(shù),內(nèi)部書寫從模型空間轉(zhuǎn)換到剪裁空間的代碼,比如法線、頂點(diǎn)坐標(biāo)、紋理坐標(biāo)等。⑥frag(v2f f),即片元函數(shù),內(nèi)部實(shí)現(xiàn)從剪裁空間返回到Unity世界空間的像素值。

2 游戲需求下涉及的算法

當(dāng)前游戲的邏輯模式已經(jīng)完成,原人物角色模型見圖3。本文的主要需求是運(yùn)用Shaderlab 將場景內(nèi)游戲角色的服裝加上光束的特效以及高光反射的效果,令人物角色在場景中擁有更出色的3D外觀表現(xiàn)。

圖3 場景下原人物角色模型

在游戲場景中,為了給人物角色添加特殊的光束效果,本文創(chuàng)新地采用光照融合疊加原理。

1) 漫反射公式:Diffuse=_LightColor0.rgb*max(dot(normalDir,lightDir),0);

其中,直射光_LightColor0 表示Unity 內(nèi)置環(huán)境光(平行光),其后加上.rgb 則代表的是直射光的顏色值。需要在注入“Lighting.cginc”的條件下再調(diào)出。Max(,)函數(shù)取最大值,dot(,)函數(shù)來進(jìn)行點(diǎn)乘運(yùn)算,此處在漫反射公式內(nèi)則是求|normalDir|*|lightDir|*cos<normalDir,LightDir>的乘積值。normalDir 表示法向量的單位向量,lightDir代表入射光方向的單位向量。

2) 高光反射公式:specular=_LightColor.rgb*pow(max(dot(normalDir,halfDir),0),_Gloss)。

公式內(nèi)Pow(a,b) 函數(shù)計(jì)算的是ab的值,_Gloss表示的是高光參數(shù)值,值的大小和高光反射的區(qū)域大小成反比。這里的halfDir 是由viewDir(觀察方向單位向量)和lightDir(入射光方向單位向量)的疊加單位向量。

3) 矩陣轉(zhuǎn)換算法:對(duì)于頂點(diǎn)從模型空間下坐標(biāo)轉(zhuǎn)換到世界空間的坐標(biāo),需要用到四維矩陣轉(zhuǎn)換,其代碼行為 f.vertex=mul(v.vertex,unity_ObjectToWorld);通過mul 函數(shù)將模型空間下的模型頂點(diǎn)坐標(biāo)v.vertex 作為行向量,與四維矩陣unity_ObjectToWorld 進(jìn)行乘積,獲得剪裁空間下的模型頂點(diǎn)坐標(biāo)f.vertex[10]。

4) 透明度alpha 值:alpha=min(1,abs(((bottom+top)/2-i.uv.x*tan(_lightAngle))-i.uv.y)/(Length/2));

這一值是實(shí)現(xiàn)人物角色自發(fā)光的重點(diǎn)之處,min(,)函數(shù)取括號(hào)內(nèi)兩數(shù)之間最小值,abs()函數(shù)取括號(hào)內(nèi)數(shù)值的絕對(duì)值,tan()函數(shù)求_LightAngle(閃光角度)的正切值,隨后和i.uv.x(紋理坐標(biāo)的X分量)一起計(jì)算得出透明度alpha值。

3 主要片元函數(shù)代碼

物體角色模型在導(dǎo)入U(xiǎn)nity場景時(shí)已配有紋理貼圖,對(duì)于光束效果來說區(qū)分為逐頂點(diǎn)和逐像素的效果追求。在如3dsMax、Maya等三維模型的繪制中,模型是由無數(shù)個(gè)三角形面組成。一個(gè)三角形的面是由三條線和三個(gè)頂點(diǎn)拼接而成,逐頂點(diǎn)會(huì)取三個(gè)頂點(diǎn)間的插值來緩和過渡顏色差。而逐像素則是計(jì)算每個(gè)像素點(diǎn)的精確值后再繪制在世界空間中,圖像上的處理會(huì)更精細(xì)但相比逐頂點(diǎn)會(huì)消耗更多的資源性能。本文中的兩個(gè)光束效果都是以逐像素為核心,通過改變片元函數(shù)中像素值來達(dá)到特定的效果。

3.1 人物角色自發(fā)光的片元函數(shù)代碼

屬性Properties中已經(jīng)定義了_MainTex(主貼圖),2D 類型且默認(rèn)值為白色,在SubShader 的pass 塊內(nèi)的CGPROGRAM~ENDCG段進(jìn)行了Sample2D _MainTex的再定義。整體Shaderlab的局部片元函數(shù)代碼如下:

通過(1) 處的Shaderlab 內(nèi)置tex2D 函數(shù)傳入?yún)?shù)_MainTex以及剪裁空間下的f.uv參數(shù),再賦給col,獲得col 的初始顏色值。(2) 處定義一個(gè)float 類型的alpha值,通過min 函數(shù)取得每個(gè)紋理采樣點(diǎn)之間的最小值再賦予alpha。在(3) 處通過返回系數(shù)為(1-alpha)的RGB 為(0.5,0.5,0.5)的顏色值和系數(shù)為alpha 的紋理顏色值,再與屬性Properties 中已定義的_Color(閃光顏色)進(jìn)行加法疊加,再賦予col,最后再返還給世界空間下的像素值,實(shí)現(xiàn)了人物角色自發(fā)光的特效。

3.2 人物角色面部高光反射的片元函數(shù)代碼

經(jīng)過Shaderlab 代碼的初始區(qū)域的結(jié)構(gòu)體定義以及頂點(diǎn)函數(shù)轉(zhuǎn)換獲取到了f.worldnormal(世界空間下法線)、f.worldvertex(世界空間下頂點(diǎn))、_MainTex(主貼圖)等。整體Shaderlab的局部片元函數(shù)代碼如下:

(1) 將f.worldnormal 通過normalize 函數(shù)來單位化獲得世界下法線的單位向量(normalDir) 。(2) 將f.worldvertex經(jīng)過世界空間下入射光方向的函數(shù)World-SpaceLightDir 轉(zhuǎn)換來獲取世界空間下每個(gè)點(diǎn)對(duì)應(yīng)的入射光方向的單位向量(lightDir) 。計(jì)算漫反射顏色值見(3)經(jīng)過dot點(diǎn)乘計(jì)算出每個(gè)點(diǎn)的世界法線向量和入射光方向的cos余弦值,再和0相比較取最大值,再乘以環(huán)境光的顏色值(_LightColor0.rgb) 以及紋理顏色值(texColor) 來得到最終的漫射光顏色值(diffuse) 。(4) 計(jì)算視角方向(即攝像機(jī)方向),高光反射的重點(diǎn)就在于視角方向。因?yàn)槿擞^察事物某個(gè)頂點(diǎn)區(qū)域從不同的角度會(huì)有不同的反射效果。將f.worldvertex 傳入世界空間下觀察方向函數(shù)UnityWorldSpaceViewDir 的轉(zhuǎn)換后再通過normalize 函數(shù)單位化后獲得世界空間下的單位視角方向向量。(5) 以局部變量halfDir(半融合向量)接受了經(jīng)過視角方向和入射光方向的疊加后的單位化向量值。(6)隨后以normalDir(世界法線單位向量)和halfDir(半融合單位向量)的點(diǎn)乘余弦值和0比較后的最大值作為pow函數(shù)的底數(shù),再以_Gloss(高光參數(shù))作為函數(shù)的冥次方計(jì)算得值,隨后將得到的值和環(huán)境光顏色以及高光顏色值做乘法融合。這里的顏色值之間的乘法融合相比加法疊加會(huì)有更少量化值的影響。(7) 最后,將漫射光顏色值(diffuse) 、高光顏色值(specular)、環(huán)境光顏色值(UNITY_LIGHTMODEL_AMBIENT) 與紋理顏色值(texColor)的乘法融合值再相加,最后再返還給世界空間下的像素值,實(shí)現(xiàn)了人物角色面部高光反射的特效。

4 Shader下結(jié)果測試

4.1 自發(fā)光測試

對(duì)應(yīng)Unity 場景,在Shaderlab 中對(duì)人物角色的自發(fā)光RGB值進(jìn)行多次更改后,顏色值呈正常相關(guān)變化,主要表現(xiàn)為人物模型保持為紋理原色,但自發(fā)光的顏色會(huì)受RGB值的影響,測試結(jié)果見表1。

表1 自發(fā)光測試結(jié)果統(tǒng)計(jì)

4.2 高光測試

人物角色面部的高光會(huì)受到高光顏色值的直接影響,但主要是由高光參數(shù)決定面部的光澤效果。在實(shí)際應(yīng)用中,高光參數(shù)區(qū)域的大小會(huì)和高光參數(shù)的值成反比,測試結(jié)果見表2。

表2 高光測試結(jié)果統(tǒng)計(jì)

5 U3D下Shader實(shí)現(xiàn)后結(jié)果

5.1 自發(fā)光效果

由于對(duì)人物角色模型添加了自發(fā)光的Shaderlab,可以看到衣服模型自上向下會(huì)有呈周期性變化的閃爍光芒效果,模型的紋理原圖會(huì)作為底層紋理與自發(fā)光相互融合產(chǎn)生不錯(cuò)的特效,具體效果見圖4。

圖4 場景下附加自發(fā)光效果后人物角色模型

5.2 高光效果

相比圖3 的原人物模型,可以發(fā)現(xiàn)人物面部色彩更細(xì)膩,面部輪廓也有了明顯的光澤,整體給用戶呈現(xiàn)出了一個(gè)更精氣神的角色,Unity場景中展示見圖5。

圖5 場景下附加高光效果后人物角色模型

5.3 自發(fā)光和高光效果融合

同時(shí)可以調(diào)整場景內(nèi)的渲染顯示質(zhì)量。在菜單欄下Edit 的Project Setting 的Quality 面板進(jìn)行設(shè)置 ,Pixel Light Count像素?zé)魯?shù)量取標(biāo)準(zhǔn)值4,Texture Quality 紋理質(zhì)量取Full Res(完整分辨率),Shadow Distance 陰影距離值取50,超過這個(gè)距離陰影將不會(huì)被顯示。這樣可以將渲染的性能開到一個(gè)很高的級(jí)別,同時(shí)也保證了渲染效率的穩(wěn)定,詳細(xì)設(shè)置可見圖6。

圖6 渲染顯示Quality設(shè)置

將自發(fā)光和高光效果共同施加在人物角色模型上,呈現(xiàn)在Unity場景中的效果見圖7。

圖7 兩種效果共同附加后人物角色模型

6 結(jié)束語

在日常游戲開發(fā)中,不僅看重游戲的可玩程度和邏輯性,也越來越重視游戲的場景特效和三維模型特效。Shader 著色器的應(yīng)運(yùn)而生為此提供了充分的擴(kuò)展性,本文通過Unity3D 和Shader 的結(jié)合實(shí)現(xiàn)了用戶想要的效果,通過自發(fā)光測試和高光測試也驗(yàn)證了效果的可行性。在今后的開發(fā)中,不應(yīng)止步于此,還可以通過Shaderlab來書寫各種各樣的渲染特效,與場景搭配融合出令用戶驚嘆贊絕、美輪美奐的游戲畫面。

猜你喜歡
效果模型
一半模型
按摩效果確有理論依據(jù)
重要模型『一線三等角』
重尾非線性自回歸模型自加權(quán)M-估計(jì)的漸近分布
迅速制造慢門虛化效果
抓住“瞬間性”效果
中華詩詞(2018年11期)2018-03-26 06:41:34
3D打印中的模型分割與打包
模擬百種唇妝效果
Coco薇(2016年8期)2016-10-09 02:11:50
FLUKA幾何模型到CAD幾何模型轉(zhuǎn)換方法初步研究
3D—DSA與3D—CTA成像在顱內(nèi)動(dòng)脈瘤早期診斷中的應(yīng)用效果比較
主站蜘蛛池模板: 亚洲国产成熟视频在线多多 | 激情爆乳一区二区| 国产jizzjizz视频| 亚洲综合天堂网| 一级毛片在线免费视频| 国产va免费精品| 日本道综合一本久久久88| 国产AV毛片| 亚洲天堂网在线播放| 亚洲国产成人精品青青草原| 一级黄色欧美| 国产精品无码AV片在线观看播放| 国产精品太粉嫩高中在线观看| 国产一区三区二区中文在线| 国产第二十一页| 亚洲欧美一区二区三区麻豆| 91青青草视频| 色综合五月| 伊人久综合| 亚洲国产中文在线二区三区免| 日韩AV手机在线观看蜜芽| www成人国产在线观看网站| 成年人国产网站| 在线中文字幕网| 亚洲综合第一区| 乱码国产乱码精品精在线播放| 久久国产精品夜色| 亚洲人成网站观看在线观看| 色噜噜综合网| 午夜国产精品视频黄| 看av免费毛片手机播放| 夜精品a一区二区三区| 亚洲成a人片7777| 黄色网页在线观看| 正在播放久久| 91久久精品国产| 国产免费怡红院视频| 亚洲成a人片在线观看88| 国产午夜人做人免费视频中文| 欧洲精品视频在线观看| 欧美精品一区二区三区中文字幕| 国产成人精品高清在线| 日本高清成本人视频一区| 亚洲人成成无码网WWW| 国产精品三级专区| 日本免费精品| 中文字幕亚洲电影| 亚洲人成网站色7777| 日韩av无码精品专区| 亚洲最大综合网| 亚洲 欧美 中文 AⅤ在线视频| 国产剧情国内精品原创| 亚洲国产清纯| 国产麻豆永久视频| 亚洲综合18p| 国产国产人在线成免费视频狼人色| 激情無極限的亚洲一区免费| 午夜精品久久久久久久无码软件| 亚洲欧洲自拍拍偷午夜色| 亚洲中文字幕手机在线第一页| 国产a v无码专区亚洲av| 中文一区二区视频| 波多野结衣中文字幕久久| 国产成在线观看免费视频| 精品国产三级在线观看| 国产在线观看成人91| 亚洲综合色吧| 性69交片免费看| www.youjizz.com久久| 99精品伊人久久久大香线蕉| 久久综合色播五月男人的天堂| 欧美视频在线播放观看免费福利资源| 亚洲男人的天堂久久精品| 国产美女主播一级成人毛片| 亚洲αv毛片| 国内黄色精品| 国产一区二区精品福利| 鲁鲁鲁爽爽爽在线视频观看| 波多野结衣在线一区二区| 国产麻豆va精品视频| 大陆精大陆国产国语精品1024| 天天综合天天综合|