圓狀的放射模糊,越靠近圓心的一定越清楚,離圓心越遠的越模糊。意思是說靠近圓心的貢獻度就較高,離圓心越遠的就越低。
假設一個二維的圓心是O,半徑是r,那在圓的任一點p,我們可以用 得到該點p離圓心佔半徑多少百分比。所以我們可以用(1 - ( |p - o| / r) ) * 點p的某個數值(像是顏色之類的),這樣就可以決定離越遠的點最後的數值要多少了。
實際例子:
圓形的地表筆刷在做模糊的方式就是這樣。假設我們現在要塗的Vertex顏色是紅色,所以如果我們算出來的(1 - ( |p - o| / r) ) = X好了,套用到我們這篇所講的Terrain Vertex Color公式,最後公式結果像這樣
X * strength * color + (1 - strength * X) * last time color = Final Vertex color
這樣就會看到紅色從圓心的中間慢慢的變淡紅,最後變成接近跟背景色是相同的。
2013年2月2日 星期六
2012年12月30日 星期日
Terrain Vertex Color
Vertex color如果我們希望有透明水彩的樣子,會透到舊的Vertex color的話,就會用顏色做lerp,會有強度做為參數,調整與舊有的顏色做加總,公式如下:
strength * color + (1 - strength) * last time color = Final Vertex color
其實就是alpha blending的公式。(上面的數值應該都保持0~1之間)
strength * color + (1 - strength) * last time color = Final Vertex color
其實就是alpha blending的公式。(上面的數值應該都保持0~1之間)
最後跟我們一般的Diffuse做相乘(應該很少會讓地表的vertex color直接覆蓋掉Diffuse)。
那因為做這種乘色的動作,通常都會降低整個顏色的亮度,所以應該還要有個亮度筆刷,其實這種亮度應該要說是最後顏色的強度,也就是在跟Diffuse做相乘時,還會再乘個數值,讓最後的顏色結果整個再提亮。公式如下:
strength * Brightness + (1 - strength) * last time Brightness = Final Brightness
FinalVertex color * Diffuse * Final Brightness = Final Diffuse
這邊從公式就看的出來,如果要提亮的話,Brightness一定要是要大於1的,當然小於1的話還是可以把它刷的更暗。
(如果改成FinalVertex color * Diffuse + Final Brightness這樣的話,看起來會有點像是粉筆筆刷的感覺,兩者就差在粉筆筆刷亮度提高後會容易看不到最後Diffuse的顏色)
這邊要注意的是資料儲存的問題,可以看到Color data in shader這篇。因為通常我們使用地表筆刷刷地表的話,一定會有內外圈,內圈和外圈中間通常是做smooth的動作,所以如果我們使用Unsigned integer來儲存資料的話,那經過smooth(如何做Smooth的動作可看到
Circle shape radial blur這篇)的話,一定會卡掉一些資料,那整個刷出來的感覺就會變成一圈一圈的,不會是一個模糊的放射狀。所以最後儲存的結果就要看到底是要存成一個image還是一個自訂binary格式。如果是image,因為最後一定是存成unsigned integer,一定還是有數值誤差的問題。那如果存成自訂binary格式的缺點就是不能編輯,彈性不夠高。
Circle shape radial blur這篇)的話,一定會卡掉一些資料,那整個刷出來的感覺就會變成一圈一圈的,不會是一個模糊的放射狀。所以最後儲存的結果就要看到底是要存成一個image還是一個自訂binary格式。如果是image,因為最後一定是存成unsigned integer,一定還是有數值誤差的問題。那如果存成自訂binary格式的缺點就是不能編輯,彈性不夠高。
2012年4月18日 星期三
Linear Depth Map
一般我們在shader內取得depth的方式是 projected position.z / projected position.w。但是這樣的depth並不是線性分佈的,離鏡頭比較近的東西,Z值變化很大,會吃掉Z值90%的值。也就是說距離鏡頭前10%的部分,如果depth的range是0~1之間的話,就會在0~0.9值在變化,剩下的離鏡頭90%的部分,就只會在0.9~1之間變化。
所以要改成projected position.z / camera far plane dist。
目前原理都不曉得為什麼,所以之後再補上。
所以要改成projected position.z / camera far plane dist。
目前原理都不曉得為什麼,所以之後再補上。
訂閱:
文章 (Atom)