Shader學習筆記

2021-09-19 23:26:50 字數 1571 閱讀 7493

direct和opengl兩種程式設計標準,前者是微軟提供的,一般用於windows平台,而後者是linux、android、ios等都共同支援的標準。

由這兩種標準就衍生出來了集中gpu程式語言,諸如hlsl、cg、glsl等,在unity裡面,並不直接使用者三種語言去編寫,而是用自己自定義的shaderlab去編寫shader,之後再根據平台去編譯成某種語言,一般現在unity重點支援的是cg語言。

shader 「name」

//如果子著色器顯示卡都不支援,就會自動降級到fallback定義的版本

[fallback]

}name = 值;

1. type型別

float,int,color(r,g,b,a)(取值範圍都是0~1),vector(4維向量),range(start,end),2d:2d紋理屬性,cube:立方體紋理屬性,3d:3d紋理屬性;

紋理型別變數宣告:name = 「name」;

options:紋理屬性選項

2. type定義subshader}

subshader

pass

}1. tags

br#2. pass

subshader 包裝了乙個渲染方案,這些方案由乙個個pass通道執行,subshader可以包括很多通道快,每個pass都能使幾何體渲染一次;

pass基本語法:

pass

catagory 分類

統一處理一類著色器效果,比如說有子shader都要關閉霧等效果

shader 「***」

subshader

subshader}}

gpu管道流水線

我們一般干預的就是頂點shader以及片元著色shader

1:控制靈活,但不能參與光照。

2:著色器中插入cg**段,編寫在cgprogram和endcg之間

3:編譯指令:由於我們能操作兩個不同的shader,所以我們寫shader的時候必須表明出入口,比如頂點著色器就是#pragma vertex name將name的函式編譯為頂點著色器,而#pragma fragment name則編譯為片元著色器

4:引數和返回值都有語義修飾(語義修飾:position 位置、tanegent 切線等)

cg的資料型別

浮點數:float、half、double

定點數:相當於把表示整數的32位(比方說)前16位表示整數,後16為表示小數,這樣就用乙個很大的整數去表示了小數,這裡的color就是這樣定義的。

邏輯:bool

紋理物件:sampler

可以定義結構體:與c#一致(盡量不要在結構體裡面定義函式)

語義語義:乙個階段處理資料,然後傳輸給下乙個階段(頂點著色器渲染流水線),那麼每個階段之間的介面,例如:頂點著色器的輸入資料是出於模型空間的頂點資料,輸出的是投影座標和光照顏色;片段處理器要將光照顏色作為輸入

輸入語義:繫結接收引數

輸出語義:繫結輸出引數

語義只在特定的入口函式才有作用,其他地方無用。

Shader 學習筆記 20151031

閱讀了unity shaders and effects cookboot的 custom light model一節。page 17 閱讀了unity online manual關於 custom light model兩段文章 閱讀了博文 unity shaders 初探su ce shader...

Shader 學習筆記 20151102

計算光源法線點乘,也就是它們之間的夾角余弦 float diflight dot s.normal,lightdir 計算視點法線點乘,也就是它們之間的夾角余弦 float rimlight dot s.normal,viewdir 給光源法線點乘搞了乙個hlambert效果 就是讓非光照面也有明暗...

Shader 學習筆記 20151113

根本原因是uv只能通過input這個struct裡面抓得到,而input只在surf 裡面才能輸入進去。那麼有乙個問題出現了,很多texture是在lighting 裡面取,例如 float roughness tex2d roughnesstex,float2 ndoth raw 0.5 0.5,...