unity3d shader締造金屬各向異性效果

2021-06-27 13:20:43 字數 3887 閱讀 5415

各向異性有兩種型別,先截個圖看看效果

一種是 徑向各向異性:

一種是 線性各向異性:

這個shader就類似金屬拉絲或者頭髮上的高光。(線性各向異性)

它能基於法線貼圖的藍色通道混合各向異性與粗糙程度。

支援漫反射(diffuse)、法線(normal)、反射(specular)、光澤貼圖(gloss)和透明(transparency)著色器

光澤與反射值也應用於各向異性高光。

高光能增大或減小表面的各向異性高光的偏移值(offset)。

各向異性高光表面的方向是被乙個像下面的方向貼圖定義的。

和切線空間的法線貼圖效果相同,在表面定義高光。然而他們不應該在unity中轉換法線貼圖。

也就是這些圖不用再轉化成法線貼圖了(我是這麼理解的)。

成員:各向異性的方向:就是表面高光的方向,和法線貼圖的切線空間方向相同。

反射:反射強度是貼圖的紅色通道定義的。控制了反射高光的亮度。

光澤:光澤強度是貼圖的綠色通道定義的。綠色越多反射高光越細越銳利,綠色越少反射高光越寬越模糊。最好把這個值設為乙個非零值。

各向異性遮罩:貼圖的藍色通道定義各向異性與blinn高光的混合,藍色越多各向異性比重越大,藍色越少blinn比重越大。

各向異性的偏移:能使各向異性離中心點遠或近

以下是本次shader需要的貼圖:

徑向各向異性效果:

線性各向異性效果:

建立乙個shader:

先瀏覽一下變數:

_specularcolor高光顏色

_specpower高光強度 

_specular高光各向異性的數目

_anisodir各向異性方向貼圖

_anisooffset各向異性的偏移

properties 

_maintint ("diffuse tint", color) = (1,1,1,1)

_specularcolor ("specular color", color) = (1,1,1,1)//高光顏色

_specpower ("specular power", range(0,30)) = 2//高光強度

_specular ("specular amount", range(0, 1)) = 0.5

_anisodir ("anisotropic direction", 2d) = ""{}//各向異性方向法線貼圖

_anisooffset("anisotropic offset", range(-1,1)) = -0.2//_anisooffset的作用偏移

}

讓著色器載入我們定義的新的函式不是以前的lambert

#pragma su***ce surf anisotropic

告訴使用shader model3.0的渲染模式

#pragma target 3.0

建立乙個新的結構體su***ceanisooutput 傳值用

albedo對光源的反射率

normal法線方向

emission自發光

anisodirection各向異性方向

specular高光反射中的指數部分的係數

gloss高光反射中的強度係數

alpha透明度

struct su***ceanisooutput

;

重要的執行函式 lightinganisotropic

先求出半形向量halfvector

再求法線方向與光照方向的點積ndotl

半形向量與各向異性方向點積hdota

求出各向異性:

sin((半形向量與各向異性方向點積+偏移值)的弧度值 * 180)

再根據各向異性求出反光強度spec

最後與光照顏色等進行整合

inline fixed4 lightinganisotropic (su***ceanisooutput s, fixed3 lightdir, half3 viewdir, fixed atten)

在surf函式中接受各向異性法線貼圖

轉化為輸出的各向異性方向

然後就ok了

void surf (input in, inout su***ceanisooutput o)
這是徑向的效果:

這是線性的效果:

全部**如下:

shader "custom/textshader" 

_maintint ("diffuse tint", color) = (1,1,1,1)

_specularcolor ("specular color", color) = (1,1,1,1)//高光顏色

_specpower ("specular power", range(0,30)) = 2//高光強度

_specular ("specular amount", range(0, 1)) = 0.5

_anisodir ("anisotropic direction", 2d) = ""{}//各向異性方向法線貼圖

_anisooffset("anisotropic offset", range(-1,1)) = -0.2//_anisooffset的作用偏移

} subshader

lod 200

cgprogram

#pragma su***ce surf anisotropic

#pragma target 3.0

sampler2d _maintex;

sampler2d _anisodir;//各向異性的

float4 _maintint;

float4 _specularcolor;

float _anisooffset;

float _specular;

float _specpower;

struct su***ceanisooutput

; inline fixed4 lightinganisotropic (su***ceanisooutput s, fixed3 lightdir, half3 viewdir, fixed atten)

struct input ;

void surf (input in, inout su***ceanisooutput o)

endcg

} fallback "diffuse"

}

---------  by wolf96

Unity3d Shader 運動模糊

攝影常用的一招就是延時攝影,以使運動的物體產生運動模糊。攝影技巧為 1,三角架固定相機 2,調長 時間 3,物件有運動物體和靜止物體參照 用了延時攝影,會產生藝術感,見下圖 2015年1月 拍攝於上海陸家嘴 遊戲方面可喜的是unity3d也可以實現類似效果,先看效果圖 第一張為無運動模糊 第二張為有...

Unity3D Shader 入門學習

unity3d 的所有渲染工作離不開著色器.shader 著色器其實是一小段程式,它負責將輸入的mesh網格.以指定的方式和輸入的貼圖或者顏色等組合作用.然後輸出.繪圖單元可以依據這個輸出來將影象繪製到螢幕上 輸入的貼圖或顏色等,加上對應的shader,以及對shader的特定引數設定,將這些內容 ...

unity3d shader之浮雕效果

浮雕就是對影象上的乙個畫素和它右下的那個畫素的色差的一種處理 非常容易,只需要乙個簡單的演算法 用fragment shader來實現 我們只看實現部分就好 在frag函式中 mc00mc tex2d maintex,i.uv maintex rgb 獲取當前點的顏色 mc11 tex2d main...