shader入門1 了解表面著色器

2021-09-23 18:33:47 字數 4887 閱讀 2772

①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 對稱加密演算法 提供了 種對稱加密演算法,其中 種是分組加密演算法,...