之前的部分記錄了凹凸紋理,漸變紋理等,接下來是紋理記錄的最後一部分——遮罩紋理。那麼什麼是遮罩呢?舉個例子,之前光照模型的實現中,高光的計算是全域性的,也就是所有的畫素使用同樣大小的高光強度和指數。但有時,我們希望模型表面的反光是各處有些不同的。為了得到這種更細膩的效果,遮罩紋理就出場了~
通過取樣得到遮罩紋理的紋素值,然後使用其中某個(或幾個)通道的值與某種表面屬性進行相乘,當該通道的值為0時,可以保護表面不受該屬性影響。
我的主觀視覺上覺得加了遮罩確實看上去更逼真和看上去更舒服了呀~
準備工作
在unity中新建乙個場景,命名為scene_7_4。預設場景中將包含乙個攝像機和乙個平行光,並使用內建的天空盒子。為便於檢視效果,在window->rendering->lighting seting->skybox
中去掉場景中的天空盒子。
新建shader(右鍵create->shader->任乙個shader
)並命名為masktexture;新建材質(右鍵create->material
)並命名為masktexturemat,將新建的shader拖拽賦給新建材質。
在場景中建立乙個capsule模型並拖拽到合適位置,將其材質修改為新建材質。
儲存場景。
shader實現:
開啟新建的masktexture,刪除所有已有**並寫入如下**:
shader "custom/masktexture"
_bumpmap("normal map", 2d) = "bump" {}
_bumpscale("bump scale", float) = 1.0
//宣告需要使用的高光反射遮罩紋理
_specularmask("specular mask", 2d) = "white" {}
//宣告用於控制遮罩影響度的係數
_specularscale("specular scale",float) = 1.0
_specular("specular", color) = (1, 1, 1, 1)
_gloss("gloss", range(8.0, 256)) = 20
}subshader
cgprogram
// 包含unity的內建的檔案,才可以使用unity內建的一些變數
#include "lighting.cginc"
#pragma vertex vert
#pragma fragment frag
fixed4 _color;
sampler2d _maintex;
float4 _maintex_st;//此處紋理屬性變數是3個紋理共用的,目的是節省需要儲存的紋理座標數目
sampler2d _bumpmap;
float _bumpscale;
//定義對應於屬性的變數
sampler2d _specularmask;
float _specularscale;
fixed4 _specular;
float _gloss;
struct a2v
;struct v2f
;// 對光照和視角方向進行了座標空間的轉換
v2f vert(a2v v)
// 遮罩紋理使用在片元著色器中
fixed4 frag(v2f i) : sv_target
endcg}}
fallback "specular"
}
儲存返回後,在masktexturemat面板上可以使用專案中的紋理資源ramptexture1~3(或其他)對main tex以及其他tex屬性進行賦值並檢視不同變化。
unity_shaders_book :
unity scripting reference :
unity manual:
max unity 方向 在2D遊戲中實現方向光照
老實講,這個需求是老闆提的。遊戲嘛,很多東西都可以做,但是做不做往往不是做的人可以決定的。這個效果雖然沒見過有遊戲實現過 一般實現的都是無方向的邊緣光 但是在一些2d動畫裡是有的 比如一款叫輪舞曲duo 的遊戲,在一些過場和戰鬥畫面裡面出現了很正確的光照效果,比如一盞燈從胸口平移過去可以看到非常合理...
unity 判斷滑動手勢方向
enum slidevector private vector2 touchfirst vector2.zero 手指開始按下的位置 private vector2 touchsecond vector2.zero 手指拖動的位置 private slidevector currentvector ...
八方向搖桿 unity
對於八方向的搖桿的想法如下 以xy平面座標系,每45 為乙個方向。public void joystickdirection float joypositionx,float joypositiony else if currentangle 67.5f currentangle 22.5f 45 ...