最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

大話Unity Shader,帶你帶你從0開始了解

2022-03-02 19:11 作者:BYCW丶幻彩  | 我要投稿

前言

Shader,一款中文名為著色器的東西,對(duì)于很多開發(fā)者來言它是一個(gè)神秘的存在,想學(xué)但是又不知道如何去學(xué),或者學(xué)了一段時(shí)間又發(fā)現(xiàn)Get不到它的點(diǎn),始終感覺游離在外,不得其法。

那么本文今天就來給大家講解一下如何從零基礎(chǔ)入門Shader,目的在于讓初學(xué)Shader的程序員或者美術(shù)er可以快速進(jìn)入這個(gè)豐富多彩的世界。

一、什么是Shader

Shader其實(shí)就是專門用來渲染圖形的一種技術(shù),通過shader,我們可以自定義顯卡渲染畫面的算法,使畫面達(dá)到我們想要的效果。小到每一個(gè)像素點(diǎn),大到整個(gè)屏幕,比如下面這兩個(gè)游戲內(nèi)比較常見的效果。





二、Shader分類

頂點(diǎn)Shader(3D圖形都是由一個(gè)個(gè)三角面片組成的,頂點(diǎn)Shader就是計(jì)算每個(gè)三角面片上的頂點(diǎn),并為最終像素渲染做準(zhǔn)備)。

像素Shader,顧名思義,就是以像素為單位,計(jì)算光照、顏色的一系列算法。

幾個(gè)不同的圖形API都有各自的Shader語言,在DirectX中,頂點(diǎn)shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader;在OpenGL中,頂點(diǎn)Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我們常說的片斷Shader或者片元Shader。

說白了,Shader其實(shí)就是一段代碼,這段代碼的作用是告訴GPU具體怎樣去繪制模型的每一個(gè)頂點(diǎn)的顏色以及最終每一個(gè)像素點(diǎn)的顏色。

三、Shader編程語言

既然Shader是一段代碼,那必然要用一種語言來書寫它,目前主流的有三種語言:基于OpenGL的OpenGL Shading Language,簡(jiǎn)稱GLSL。基于DirectX的High Level Shading Language,簡(jiǎn)稱HLSL。還有NVIDIA公司的C for Graphic,簡(jiǎn)稱Cg語言。

GLSL與HLSL分別是基于OpenGL和Direct3D的接口,兩者不能混用。而Cg語言是用于圖形的C語言,這其實(shí)說明了當(dāng)時(shí)設(shè)計(jì)人員的一個(gè)初衷,就是讓基于圖形硬件的編程變得和C語言編程一樣方便,自由。

正如C++和 Java的語法是基于C的,Cg語言本身也是基于C語言的。如果您使用過C、C++、Java其中任意一個(gè),那么Cg的語法也是比較容易掌握的。Cg語言極力保留了C語言的大部分語義,力圖讓開發(fā)人員從硬件細(xì)節(jié)中解脫出來,Cg同時(shí)擁有高級(jí)語言的好處,如代碼的易重用性,可讀性高等。Cg語言是Microsoft和NVIDIA相互協(xié)作在標(biāo)準(zhǔn)硬件光照語言的語法和語義上達(dá)成了一致,所以,HLSL和Cg其實(shí)是同一種語言。

一般來說為了跨游戲平臺(tái)方便,一般學(xué)CG語言。

四、什么是Unity Shader

顯卡有NVIDIA、ATI、Intel等等。圖形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。Shader編程語言有GLSL、HLSL、Cg等等。

是不是有點(diǎn)頭暈,該怎么去選擇呢?在Unity中我們又應(yīng)該如何做呢?

其實(shí)在Unity中反而一切變的簡(jiǎn)單起來了,我們只需關(guān)心如何去這實(shí)現(xiàn)我們想要的效果就好了,其余的事情全部交給Unity來自動(dòng)處理。因?yàn)槲覀冊(cè)赨nity中編寫的Shader最終會(huì)根據(jù)不同的平臺(tái)來編繹成不同的著色器語言,那么我們?cè)赨nity中應(yīng)該用什么語言來書寫Shader呢?

官方的建議是用Cg/HLSL來編寫,當(dāng)然你也可以使用GLSL,主要是因?yàn)镃g/HLSL有更好的跨平臺(tái)性,更傾向于使用Cg/HLSL來編寫Shader程序。

Unity Shader嚴(yán)格來說并不是傳統(tǒng)上的Shader,而是Unity自身封裝后的一種便于書寫的Shader,又稱為ShaderLab。在Unity中有3種Shader(其實(shí)就是三種不同的寫法):Surface Shaders 表面著色器;Vertex/Fragment Shaders 頂點(diǎn)/片斷著色器;Fixed Function Shaders 固定管線著色器;其中Fixed Function Shaders已經(jīng)被淘汰,完全沒有學(xué)習(xí)的必要了。Surface Shader其實(shí)就是Unity對(duì)Vertex/Fragment Shader的又一層包裝,以使Shader的制作方式更符合人類的思維模式,同時(shí)可以以極少的代碼來完成不同的光照模型與不同平臺(tái)下需要考慮的事情。



但是Surface Shader也有它的局限性,就是Vertex/Fragment Shader能實(shí)現(xiàn)的效果,Surface Shader不一定能實(shí)現(xiàn),反過來則成立,Surface Shader能實(shí)現(xiàn)的Vertex/Fragment Shader則一定可以實(shí)現(xiàn)。

并且在Unity2018后的版本中推出了Unity官方自己的可視化Shader工具(Shader Graph)。從生成的代碼上來看,也全部是用的Vertex/Fragment Shader,那是不是可以理解為在今后的可編程渲染管線中,Unity自己也拋棄了Surface Shader,而全部采用了Vertex/Fragment Shader?

總之,在今后的學(xué)習(xí)過程中,也會(huì)涉及一些Surface Shader的內(nèi)容,但主要還是會(huì)以Vertex/Fragment為主。

另外,學(xué)會(huì)Shader也會(huì)給我們帶來很多的好處:游戲中模型顯示粉色的情況你一定碰到過吧,是Shader丟失呢,還是Shader不符合當(dāng)前平臺(tái)呢,又或者是Shader上有語法的錯(cuò)誤呢?如果我們有了解并學(xué)會(huì)Shader的話,這些問題就不會(huì)再是一臉懵逼啦。



內(nèi)建Unity Shader僅僅只是“通用”用例,不足以滿足我們所有的畫面表現(xiàn)需求。

一旦掌握Shader,可以為游戲/應(yīng)用創(chuàng)造獨(dú)一無二的視覺享受。根據(jù)實(shí)際需求,為游戲和應(yīng)用實(shí)現(xiàn)特定功能的Shader。

能極大的幫助我們做渲染上的性能優(yōu)化,因?yàn)橥ㄟ^Shader可以控制渲染什么以及如何渲染。

撰寫Shader的能力對(duì)于游戲團(tuán)隊(duì)非常重要,掌握Shader技能的開發(fā)一直是炙手可熱的職位?,F(xiàn)在一個(gè)不爭(zhēng)的事實(shí)就是,技術(shù)美術(shù)永遠(yuǎn)是各大廠商的稀缺資源。

五、Shader核心知識(shí)

1.渲染管線

又叫渲染流水線,是顯示芯片內(nèi)部處理圖形信號(hào)相互獨(dú)立的并行處理單元。一個(gè)流水線是一序列可以并行和按照固定順序進(jìn)行的階段,遵循著前入后出的流程。類比來說,就像是一個(gè)工廠,同時(shí)生產(chǎn)寶馬和賓利兩種汽車,這兩款汽車的每個(gè)零件又是同時(shí)制作的,就可以說這個(gè)車間內(nèi)有兩個(gè)不同的渲染管線。



根據(jù)上圖進(jìn)行說明。3D軟件或是游戲在運(yùn)行的時(shí)候,會(huì)調(diào)用圖形API,OpenGL或者是DirectX。而頂點(diǎn)著色器和片段著色器就在圖中GPU運(yùn)算框全部產(chǎn)生作用。



上圖就是針對(duì)到unity引擎中。Geometry部分可以理解為建模,這個(gè)過程就是把Mesh數(shù)據(jù)導(dǎo)入到unity之中,unity引擎再調(diào)用圖形API,而調(diào)用圖形API的過程就是在驅(qū)動(dòng)GPU進(jìn)行處理運(yùn)算。

進(jìn)入到GPU后,首先進(jìn)行的是頂點(diǎn)處理程序(Vertex Processor)對(duì)應(yīng)頂點(diǎn)shader,頂點(diǎn)運(yùn)算的結(jié)果會(huì)傳遞給像素處理器(Pixel Processor相當(dāng)于片段處理器),其對(duì)應(yīng)的便是像素shader(也就是片段shader),最后輸出可以在屏幕上顯示的像素信息,即Frame Buffer(幀緩沖),F(xiàn)rame Buffer不僅可以儲(chǔ)存顏色信息還可以儲(chǔ)存深度值。



2.shader 材質(zhì) 貼圖

著色器實(shí)際就是一小段程序,他負(fù)責(zé)將輸入的頂點(diǎn)數(shù)據(jù)以指定的方式和輸入的貼圖或者顏色等組合起來,然后進(jìn)行輸出。繪圖單元可以以及這個(gè)輸出來將圖像繪制到屏幕上。

輸入的貼圖或者顏色等,加上對(duì)應(yīng)的shader,以及對(duì)shader的特定的參數(shù)設(shè)置,將這些內(nèi)容(shader及輸入?yún)?shù))打包儲(chǔ)存在一起,得到的就是一個(gè)Material(材質(zhì)),這些包里其實(shí)還有其他東西比如向量、矩陣。之后,我們便將材質(zhì)賦予到三維模型上進(jìn)行渲染(輸出)了。



材質(zhì),就像是游戲引擎最終使用的商品,shader就好比是生產(chǎn)這種商品的加工方法,而貼圖則是這商品的原材料。如果我們不用Unity或是其他引擎的話,實(shí)現(xiàn)材質(zhì)就需要利用OpenGL或是DirectX的API的調(diào)用,手動(dòng)組織出個(gè)shader,這樣就很麻煩,所以引擎提供了便捷。

六、unity中shader的編寫形式

有三種:surface shader vertex and Fragment shader fixed function shader。我們知道,硬件只識(shí)別頂點(diǎn)著色和片段著色,那么unity引擎中為何還會(huì)多出來一個(gè)surface shader(以下簡(jiǎn)稱SS)和Fixed Function shader(以下簡(jiǎn)稱FFS)呢。

對(duì)于FFS,主要是對(duì)于固定管線的硬件的操作,是特別保守的shader能得到絕大部分硬件的支持;而SS呢,是unity推薦用的,創(chuàng)建一個(gè)shader在unity中的時(shí)候,默認(rèn)的代碼就是SS。實(shí)際上SS是對(duì)頂點(diǎn)和片段著色器的一種“包裝”,在SS編程后unity會(huì)將SS代碼編譯成硬件可識(shí)別的頂點(diǎn)和片段著色器代碼 書寫shader的主要結(jié)構(gòu):



七、ShaderLab

ShaderLab是為unity定制的專門用于編寫Shader的語法,可以容納其他三種shader。shaderLab的主要結(jié)構(gòu):



花括號(hào)內(nèi)的三個(gè)部分:Properties,Subshaders,Fallback。什么是Properties呢,屬性。我們?cè)趗nity中新建一個(gè)材質(zhì)球和一個(gè)shader,打開編譯器將shader命名為“111”,再將111shader拖拽給材質(zhì)球,再點(diǎn)擊材質(zhì)球觀察其顯示與代碼中Properties的內(nèi)容。我們發(fā)現(xiàn),shader編程中的Properties(屬性)會(huì)讓擁有該shader的材質(zhì)球的屬性以列表的形式顯示出來,進(jìn)行參數(shù)調(diào)節(jié)。



subshader是啥呢,算法,就是寫給GPU渲染的shader片段了,這里記住,一個(gè)shader當(dāng)中至少有一個(gè)subshader。每一次顯卡進(jìn)行處理的時(shí)候呢,只能選擇其中一個(gè)subshader去執(zhí)行。那為什么會(huì)有多個(gè)subshader呢?這和硬件有關(guān)。

在讀取shader的時(shí)候,會(huì)先從第一個(gè)subshader讀取,如果第一個(gè)能適配當(dāng)前硬件,就不會(huì)往下讀了;如果硬件太老跟不上,第一個(gè)讀取不了,就會(huì)讀取第二個(gè)看能不能與我適配。也就是說,subshader的所有方案會(huì)向下簡(jiǎn)化。如果這些列舉的subshader都用不了怎么辦?那就是第三個(gè)Fallback了。

FallBack就是在subshader都用不了的時(shí)候可以回滾到指定的unity中一個(gè)都能適配的shader。unity常用的內(nèi)建shader的如下:



大話Unity Shader,帶你帶你從0開始了解的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
兴山县| 五莲县| 靖边县| 南澳县| 福建省| 牟定县| 岑溪市| 东海县| 平和县| 普兰店市| 灵丘县| 商南县| 水城县| 息烽县| 沙河市| 丹东市| 浦城县| 屏边| 论坛| 黄龙县| 桦川县| 措美县| 邓州市| 容城县| 三明市| 密云县| 临西县| 永嘉县| 渭南市| 且末县| 宁津县| 金堂县| 崇州市| 大同市| 克东县| 佛教| 灵宝市| 屯留县| 苗栗市| 澄城县| 金阳县|