Wzy Shader新手入門精講(一)

2021-08-13 08:52:16 字數 2265 閱讀 3139

因為我也是個shader的新手入門著,其實感覺找到門還是挺麻煩的,所以本著自己感覺已經入門了的經驗分享一下,如有不對,請指示:

首先可以把shader看成乙個標準的框架:我對新的那個不熟悉所以分享的是舊版的shader寫法;

框架結構:

一、首先從屬性中先介紹各個屬性的宣告及型別:

拿第乙個為例子

_color("color",color)=(1,1,1,1)  _color和括號裡的字串「color」是自己隨意定義的名字_color是在shader內部用的名字;字串是在unity介面顯示的名字(盡量統一方便外部獲取);

=號後面是預設值;fiex4型別宣告

_vector("vector",vector)=(1,2,3,4)   float4型別宣告

_int("int",int)= 34234      int型別宣告

_float("float",float) = 4.5   float型別接收

_range("range",range(1,11))=6    float型別宣告

_2d("texture",2d) ="red"{}        sampler2d宣告

_cube("cube",cube) ="white"{}     samplercube宣告

_3d("texure",3d) ="black"{}       sampler3d 宣告

二、subshader的pass塊外面沒有東西了 至少入門是:

pass塊在需要時 需要乙個標籤:tags

只有定義了正確的lightmode才能得到一些unity的內建光照變數

其他的東西暫時還沒用過;

#include"lighting.cginc"

標註了包含

unity

的內建的檔案,才可以使用

unity

內建的一些變數;

這兩個匯入可以使用

_lightcolor0.rgb 第乙個直射光的顏色  0一般只有乙個直射光;

_worldspacelightpos0.xyz; 

第乙個直射光的位置

=對於每乙個頂點的光的方向記得標準化:

unity_lightmodel_ambient.rgb 獲取

unity

內建的光照模型的設定環境光;

_worldspacecamerapos.xyz 

然後是編譯指示兩個函式,這裡我叫做宣告抽象方法。。。

#pragma vertex vert  

這個是頂點操作的方法體(所有的頂點操作盡量放在這裡而且這個函式比下面的畫素函式效率要高一些);

#pragma fragment frag 

這個是片元函式;操作一些畫素點的計算量比較大;計算光照反射的顏色渲染都在這裡;

在頂點函式中是可以代替外面的mesh頂點變形直接更改頂點位置的;(畢竟這裡是gpu);

然後我還會定義兩個結構體:乙個是接收系統返回的各項資料;另乙個用來把這些資料轉換到片元函式中;

struct a2v{}:注意這裡需要加分號;結構體的命名雖然可以自己定義但是盡量保持這個因為有的一些巨集設定會呼叫這個名字;

我先介紹一下需要從系統返回的資料型別:

float4  position       頂點座標

float3  normal       模型空間下的法線方向

float4   texcoord0~n     第一套紋理座標

tangent       切線

color         頂點顏色

struct v2f{};上面同理;

我在介紹一下能傳輸變數的資料寫法:

texcoord0~7   傳遞紋理座標

float4/float3   color0  傳遞4個值或者3個值  (一組值)

float4/float3   color1  傳遞4個值或者3個值   

完善方法體內容自構:

既然已經宣告了抽象方法就需要實現它:

v2f  vert(a2v v)

void frag(v2f f):sv_target(這個是必須寫的是float4的值為顏色值輸出到平面的顏色){

然後按照最初的結構完善,然後直接就能執行了:

貼一段** 現在應該都能看懂了 看不懂的全是規定寫法的定義直接查就好了:

ubuntu新手入門

ubuntu使用設定之介面篇 ubuntu系統裝好了,不過怎麼看上則呢麼醜醜的?好像mr徐的介面和我的不一樣呢,怎麼設定的呢?首先,讓我們來設定工具條。ubuntu預設2條工具條,讓我們來把他設定成和windows下一樣的吧。先讓我們在上面的工具條的空白的地方,選擇刪除面板。然後,讓我們在底下的面板...

XML新手入門

ibm的xml教程 xml是什麼?xml,或稱為可擴充套件標記語言 extensible markup language 是一種您可以用來建立自己的標記的標記語言。它由全球資訊網協會 w3c 建立,用來克服 html 即超文字標記語言 hypertext markup language 它是所有網頁...

SOA新手入門

什麼是soa 我們可能應該回答的第乙個問題也是最基本的問題。什麼是面向服務的體系結構 service oriented architecture,soa 這個問題的答案實際上涉及與開發相關的若干不同方面。soa 是一種 it 體系結構樣式,支援將您的業務作為鏈結服務或可重複業務任務進行整合,可在需要...