Shader之小白入門學習五

2021-10-01 14:39:41 字數 2677 閱讀 7656

先實現乙個只有顏色屬性可調節的簡單材質效果,如下圖所示:

模型可隨便找乙個,預設的幾何體也可以,在材質面板中只有乙個顏色屬性,當我們點開拾色器時,對應的模型也會自動發生變化。我們就用之前的myfirstshader來完善。

在乙個shader中,可以有多個subshader以及乙個subshader中也可以有多個pass。但是乙個shader中必須要至少有乙個subshader,並且這個subshader中也必須至少有乙個pass。subshader我們已經知道是什麼了,接下來就來介紹一下pass。

**pass的意思就是渲染一次模型!**而具體要怎麼渲染就需要我們在pass中新增cg/hlsl**片段來實現了,這段**片段是由cgprogram開始,由endcg結束。u而就是說我們必須要新增cgprogram和endcg,然後在他們中間去寫實現效果的**。好!那我們就按unity規定的要求擺好姿勢!

shader "ta/myfirstshader"

subshader }

//fallback "diffuse"

//customeditor "editorname"

}

既然是經典片段著色器,那麼就要先定義好頂點著色器與片段著色器,告訴unity分別在**去執行他們。

:#pragma是unity內建的編譯指令用的命令,在pas中我們就利用此命令來宣告所需要的頂點著色器與片段著色器。

#pragma vertexname

定義頂點著色器為name,通常情況下會起名為vert。

#pragma fragmentname

定義片斷著色器為name,通常情況下會起名為frag。

宣告完後,就開始實現具體的內容吧

顧名思義,頂點著色器就是處理頂點的著色器,每個頂點都會執行一次頂點著色器。

解釋一下頂點這個函式的結構。

頂點著色器函式的名稱,在上面我們已經指定了頂點著色器的名稱就是vert,所以這裡我們必須要用vert作為名稱。

其中float4 vertex是我們自己定義的乙個四維向量,名字叫vertex(名字我們可以隨便起),僅僅定義乙個四維向量並不能使它擁有我們模型的頂點資訊,所以這倆我們需要為它指定乙個語義–position,position就是代表著模型的頂點位置資訊。此時變數vertex就表示著我們模型的頂點位置。

在頂點著色器中最重要的事情就是將頂點從模型座標轉換到裁剪座標(說白了就是將模型顯示在二位顯示器上時需要做的一些矩陣變換)。不會矩陣變換怎麼辦,沒關係,unity已經幫我們準備好現成的命令了,只需要呼叫unityobjecttoclippos即可,後面括號中加上我們的頂點位置變數就可以了

。然後呢,在後面的片段著色器中我們需要頂點著色器中的輸出結果,所以3中需要加上return來轉換後的頂點返回,float4就是用來定義我們返回的是四維向量。

經過變換後返回的頂點位置,我們也需要利用語義來標記一下,以便片段著色器可以知道哪個是從頂點著色器輸出過來的頂點位置資訊。所以我們在函式的後面加上:sv_position。

:簡單地說position語義是用於頂點著色器,用來指定模型的頂點位置,是在變換前的頂點的本地空間座標。sv_position語義則用於畫素著色器,用於標識經過頂點著色器變換之後的頂點座標。在頂點著色器中處理頂點時,我們首先需要獲取到模型的頂點資料(比如頂點位置,法線資訊,頂點顏色等等),那麼這些資料都是直接儲存在模型中的,我們在shader只需要通過標識語義就可以自動獲得。

此時的shader還無法正常編譯,因為除了頂點著色器外,我們還需要乙個片段著色器。

片段著色器也被稱為畫素著色器,主要是處理最終顯示在螢幕上的畫素結果。

經過頂點著色器的處理,我們已經得到了最終顯示在螢幕上的定點矩陣,內部會自動進行插值計算,以獲得當前模型的所有片段畫素,然後每個畫素都會執行一次片段著色器,得到每個畫素的顏色值。

片段著色器的函式名,一種()是空的,因為在這個簡單的示例中我們不需要額外的資料傳過來,所以暫時為空。

在cg/hlsl中使用properties中的變數前還需要在cg/hlsl中再重新宣告一次。名稱要求一致,這是死規則,我們只能按照要求來執行。float,half,fixed,這三個都是浮點數的表時,只是分別對應的精度不一樣,主要用此可以進行更進一步的優化。

直接返回_color,也就是直接返回我們在材質面板中定義的顏色,這也是我們這個小例子想要的效果。

同樣,返回值是個四維向量,我們用float4來表示,如果想優化的話就用fixed4來表示,關於精度問題我們後面會說。

shader "ta/myfirstshader"

subshader

fixed4 frag()

: sv_target

endcg

}}//fallback "diffuse"

//customeditor "editorname"

}

此時我們已經可以正常編譯並實時更換顏色得到反饋了。

五 WebGL入門,shader剖析

webgl用的shader語言是glsl opengl shading language shader的主要工作有 1.利用檢視和投影矩陣對點的位置進行變化 2.如果需要利用法線的時候,也同樣需要利用檢視矩陣對其進行轉換 3.紋理座標的產生和轉換 4.頂點的光照或者象素光照的計算 5.顏色計算 1 ...

小白之深度學習入門

深度學習最近這幾年炒的特別熱,而且在計算機視覺方面應用廣泛,故而決定學習了解一波。那麼,第乙個問題就來了,什麼是機器學習?哇咔咔,這個光看名字就知道了,就是讓機器具有人類不斷學習的能力,並且解決我們現有的一些問題。先來說幾個簡單的概念 特徵 就是物體的屬性,我們人類經過學習之後,可以很快的將簡單的特...

Shader入門學習手記

shader程式的基本結構 在 中學習吧,注釋都寫好了。shader first fantasy water water diffuse 它只對2d,rect或者cube貼圖有關,在寫輸入時我們最少要在貼圖之後寫一對什麼都不含的空白的 當我們需要開啟特定選項時可以把其寫在這對花括號內。如果需要同時開...