①fixed function shader :屬於固定渲染管線 shader, 基本用於高階shader在老顯示卡無法顯示時的回滾。使用的是shaderlab語言,語法與微軟的fx files 或者nvidia的 cgfx類似。
②vertex and fragment shader:最強大的shader型別,屬於可程式設計渲染管線. 使用的是cg/hlsl語法。
③su***ce shader:unity3d推崇的shader型別,使用unity預製的光照模型來進行光照運算。使用的也是cg/hlsl語法。
unity主要使用第三種,所以我們主要學習第三種shader的寫法
在unity中新建乙個standard su***ce shader,可以得到如下預設**
shader "custom/newsu***ceshader 1"
_glossiness ("smoothness", range(0,1)) = 0.5
_metallic ("metallic", range(0,1)) = 0.0
}subshader
lod 200
cgprogram
// physically based standard lighting model, and enable shadows on all light types
#pragma su***ce surf standard fullforwardshadows
// use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0
sampler2d _maintex;
struct input
;half _glossiness;
half _metallic;
fixed4 _color;
// add instancing support for this shader. you need to check 'enable instancing' on materials that use the shader.
// see for more information about instancing.
// #pragma instancing_options assumeuniformscaling
unity_instancing_buffer_start(props)
// put more per-instance properties here
unity_instancing_buffer_end(props)
void surf (input in, inout su***ceoutputstandard o)
endcg
}fallback "diffuse"
}
type的屬性
color - 一種顏色,由rgba(紅綠藍和透明度)四個量來定義;
2d - 一張2的階數大小(256,512之類)的貼圖。這張貼圖將在取樣後被轉為對應基於模型uv的每個畫素的顏色,最終被顯示出來;
rect - 乙個非2階數大小的貼圖;
cube - 即cube map texture(立方體紋理),簡單說就是6張有聯絡的2d貼圖的組合,主要用來做反射效果(比如天空盒和動態反射),也會被轉換為對應點的取樣;
range(min, max) - 乙個介於最小值和最大值之間的浮點數,一般用來當作調整shader某些特性的引數(比如透明度渲染的截止值可以是從0至1的值等);
float - 任意乙個浮點數;
vector - 乙個四維數;
properties的作用僅僅是把讓type可以顯示在面板上,不在properties中定義的屬性依然可以使用
//定義著色器屬性 在這裡定義的屬性將被作為輸入提供給所有的子著色器.屬性定義的格式如下
/*_name("display name",type)=defaultvalue
*_name代表屬性名,如color,maintex,glossiness,metallic等等
*display name是在inspector中顯示的名字"
*/properties
//預設的白色紋理
_glossiness ("smoothness", range(0,1)) = 0.5//預設光滑度
_metallic ("metallic", range(0,1)) = 0.0//金屬光澤度
}
tags標籤是三種型別的shader都具有的標籤,它決定了硬體什麼呼叫該子著色器
tags標籤裡面預設的「rendertype」=」opaque」,是告訴系統應該在渲染非透明物體時呼叫這個subshader
「rendertype」=」transparent」表示在渲染含有透明效果的物體時呼叫該sunshader,
tags裡面還有許多其他的我們可選的標籤
①.」queue」:定義渲染順序。預製的值有這些
」background」。值為1000。比如用於天空盒。
」geometry」。值為2000。大部分物體在這個佇列。不透明的物體也在這裡。
」alphatest」。值為2450。已進行alphatest的物體在這個佇列。
」transparent」。值為3000。透明物體。
」overlay」。值為4000。比如鏡頭光暈。
使用者可以定義任意值,比如」queue」=」geometry+10」
②「rendertype」:定義渲染型別。預製的值有這些
」opaque」:絕大部分不透明的物體都使用這個;
」transparent」:絕大部分透明的物體、包括粒子特效都使用這個;
」background」:天空盒都使用這個;
」overlay」:gui、鏡頭光暈都使用這個;
③」forcenoshadowcasting」:定義物體是否有陰影效果
「true」。表示有陰影
「false」。表示沒有陰影
細節等級 預設200, 數值越高 對硬體的要求越高
lod 200
cgprogram到endcg是shader的核心內容
cgprogram
endcg
宣告我們要寫乙個su***ce shder,並指定了光照模型.寫法如下:
#pragma su***ce su***cefunction lightmodel [optionalparams]
可以看到 預設** 宣告了乙個su***ce shader,指定方法名為 surf ,光照為預設光照standard
(我們可以在下面找到surf這個著色器方法)
#pragma su***ce surf standard fullforwardshadows
lambert:該光照模型能很好的表示粗糙表面的光照,但不能表現出鏡面反射高光
toon:最近在遊戲中常用的風格之一即是toon shading(又稱 cel shading).這是一種非逼真渲染風格,通過改變了光在乙個模型上反射實際情況來給人以手繪的感覺
blinnphong:**鏡面反射材料
standard:unity5中預設的光照模式是standard, 其引入了 物理渲染 (pbr), 但是與其它光照模型沒有什麼不同。相比於朗伯反射, pbr提供了乙個更加逼真的光線物體作用模型,pbr考慮了材料的物理屬性, 比如能量守恆以及光的散射
在cgprogram中把屬性中的引數定義成了更詳細的的資料型別
sampler2d _maintex;
half _glossiness;
half _metallic;
fixed4 _color;
其中sampler2d是紋理屬性,不屬於基本資料型別,儲存了2d貼圖的資料
基本資料型別有三種,float,half,fixed
float:32位高精度浮點數。
half:16位中精度浮點數。範圍是[-6萬, +6萬],能精確到十進位制的小數點後3.3位。
fixed:11位低精度浮點數。範圍是[-2, 2],精度是1/256。
基本資料型別又可以組合成向量(vector)或者矩陣(matrix)
比如fixed4就是4個fixed,fixed4x4就是16個fixed組成的矩陣
這個結構體和surf函式中的另乙個引數inout結構體是相對的,乙個代表輸入,乙個代表輸出。我們可以這樣理解這兩個結構體,你定義輸入資料結構(inputs struct)、編寫自己的su***ce函式處理輸入、最終輸出修改過後的su***ceoutput。input其實是需要我們去定義的結構,所以我們可以把所需要參與計算的資料都放到這個input結構中,傳入surf函式使用
預設的input結構體中有乙個uv_maintex引數,代表了紋理的uv值,我們便可以在surf函式中直接使用這個引數了。
struct input
;
輸出的su***ceouput結構體如下:
struct su***ceoutput
現在我們大概可以看懂shader的方法裡大概寫了什麼內容了
注釋中寫了metallic 和smoothness 來自slider變數
su***ceoutputstandard是引用資料,所以不傳出也改變了值
void surf(input in, inout su***ceoutputstandard o)
當前的硬體可能不支援我們寫下的cg程式,這行**是為了保險,降低了硬體的需求,嘗試執行渲染
fallback "diffuse"
Unity3D著色器Shader程式設計入門
自學unity3d也有大半年了,對shader一直不敢入坑,最近看了些資料,以及通過自己的實踐,對shader還是有一點了解了,分享下僅作入門參考。狗刨學習網 因shader是對影象影象渲染的,學習前可以去了解下圖形影象學及gpu程式設計相關的知識。強烈推薦 gpu 程式設計與cg 語言之陽春白雪下...
shader入門10 透明效果1
在unity中我們通常有兩種方法可以實現透明效果 透明度測試只能控制物體完全透明或者完全不透明,所以大部分情況下使用的都是透明度混合的效果 透明度混合需要考慮渲染順序.之前從來沒考慮過渲染順序的問題是因為對於不透明物體,有深度緩衝這種機制的存在.深度緩衝會對物體進行深度測試,原理利用快取中的深度判斷...
Openssl入門 1 基本概念了解
安全協議的層次 1 應用層 pgp pretty good privacy 2 傳輸層 ssl 3 網路層 vpn openssl主要由三個部分組成 1 密碼演算法庫 2 ssl協議庫 3 應用程式庫 openssl的主要功能 1 對稱加密演算法 提供了 種對稱加密演算法,其中 種是分組加密演算法,...