C for Graphic 頂點片段變色

2021-10-01 11:16:15 字數 2826 閱讀 9611

今天中午深圳老同事問我怎麼搞模型逐漸變色,他們策劃需要模型有個變色的過程,他自己就只在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 ...