今天中午深圳老同事問我怎麼搞模型逐漸變色,他們策劃需要模型有個變色的過程,他自己就只在c#中做color.lerp,達不到要求,週六被拉著加班。我也正好在家裡做自己的小遊戲,所以幫他寫了兩個,原理無非是頂點或者片段依次變色就好了。想著這需求還挺常見的, 就水一篇部落格。
如果我們使用的頂點著色,也就是頂點賦值顏色,則只需要依次修改頂點的顏色就好了,如下:
首先寫乙個普通的頂點光照shader,如下:
shader "custom/colorvertshader"
subshader
lod 100
pass
;struct v2f
;float4 _maincolor;
float4 _ambientfactor;
float4 _lightfactor;
float4 _diffusefactor;
float4 _specula***ctor;
float _speculargloss;
fixed4 frag (v2f i) : sv_target
endcg}}
}
效果如下:
接著修改頂點顏色,修改**如下:
具體做法就是根據頂點id進行時間軸上的變色就行了,判斷當前vid小於時間軸上的vertex變色即可。
float3 worldnormal = unityobjecttoworldnormal(v.normal.xyz);
float3 worldvertex = mul(unity_matrix_m, v.vertex).xyz;
float3 worldp2s = worldspacelightdir(v.vertex);
float3 worldp2v = worldspaceviewdir(v.vertex);
float3 worldhdir = normalize(worldp2s + worldp2v);
float3 ambient = unity_lightmodel_ambient.xyz * _ambientfactor;
float3 light = _lightcolor0.rgb * _lightfactor;
float3 diffuse = light * max(dot(worldnormal,worldp2s),0)*_diffusefactor;
float3 specular = light * pow(max(dot(worldnormal, worldhdir), 0), _speculargloss) * _specula***ctor;
o.color *= float4(ambient + light + diffuse + specular,1);
return o;
}效果如下:
可以明顯看的出來逐頂點變色的特點,那就是頂點的索引順序是建模得來,同時看得出來unity提供的球形是立方體凸變而成的,當然也看得出來頂點著色的插值處理,導致頂點與頂點之間是紅到白的漸變。
這種當然不怎麼符合要求了,而且現在gpu cpu都挺強大的,不需要我們特意寫頂點光照這麼要求效率的shader,所以我們將光照和變色放到fragment片段函式中處理吧,片段函式中光照很簡單了,就把計算從vert改到frag即可,變色呢?無非就是逐uv值進行變色了,**如下:
用uv的xy分量判斷變色即可
shader "custom/colorfragshader"
_maincolor("maincolor", color) = (1,1,1,1)
_destcolor("destination color",color) = (1,0,0,1)
_ambientfactor("ambient factor",color) = (1,1,1,1)
_lightfactor("light factor",color) = (1,1,1,1)
_diffusefactor("diffuse factor",color) = (1,1,1,1)
_specula***ctor("_specular factor",color) = (1,1,1,1)
_speculargloss("_specular gloss",range(1,100)) = 10
_colorspeed("color speed",range(0,50)) = 1
}subshader
lod 100
pass
;struct v2f
;sampler2d _maintex;
float4 _maintex_st;
float4 _maincolor;
float4 _destcolor;
float4 _ambientfactor;
float4 _lightfactor;
float4 _diffusefactor;
float4 _specula***ctor;
float _speculargloss;
float _colorspeed;
fixed4 frag (v2f i) : sv_target
效果如下:
效果還是好一些的。
嗯,現在很少寫部落格了,業餘時間做遊戲玩遊戲比較重要。
unity中頂點片段shader環境反射
最近具體聯絡了一下裡面shader的基本寫法,弄來個綜合版本 然後就是最難看出差異的反射計算問題,頂點裡面計算和片段裡面計算的區別 使用的模型是這個,其中右邊的是平滑法線後的模型 具體的差異可以看下面gif圖 可以看出 下面是 shader unlit shenmifangkeshader norm...
C for Graphic 遮擋透視
最近剛好用上了這個效果所以記錄一下,原理不再贅述,通過之前的透明原理和渲染佇列詳解就可以了解。遮擋透視可以區分為兩部分,第一部分未被遮擋的頂點則正常柵格化著色,第二部分被遮擋的頂點則ztest greater 也就是判斷當前頂點depth更大距離相機更遠則柵格化著色 下面實現shader shade...
頂點著色器 片段著色器
一 著色器 著色器只是一種把輸入轉化為輸出的程式。著色器也是一種非常獨立的程式,因為它們之間不能相互通訊 它們之間唯一的溝通只有通過輸入和輸出。在最簡配置下,至少都得有兩個著色器 乙個叫頂點著色器 vertex shader 它將作用於每個頂點上 另乙個叫片段著色器 fragment shader ...