shadertoy知識點小總結20200512

今天是汶川地震12週年,其實早上來的時候我並不知道,是我同事和我說我才知道的。今天感覺很疲憊,但還是想總結一下,畢竟我這個金魚的記憶力是靠不住的。

1、首先是幾個函數的總結

(1)step函數:這個函數我其實見過很多遍了,但是我老是記不住,step(a,x)
當x<a時 函數爲0,其他情況函數爲1
(2)floor函數:成爲階梯函數,向下取整函數,取得當前小於或者等於x值的整數,需要注意的是,floor(-2.2)=-3 floor(2.2)=2
(3)fmod函數:取餘函數 一開始對於這個函數是一點不懂的,後來在百度查呀查終於明白啦!
fmod這個函數的性質就是值域一定是小於或者等於被除數的。而且如果除數小於被除數,那麼餘數就是除數本身啦,而且餘數本身是可以是小數和負數的。
(4)sign函數:稱爲符號函數,如果x<0,那麼函數取值爲-1,如果x>0,那麼函數取值爲1,如果x=0,那麼函數取值爲0。
(5)clamp函數:clamp函數稱爲固值函數(我自己起的哈哈),因此需要有三個參數,clamp(x,a,b)如果x<a,則函數爲a,如果x>b,則函數爲b,其餘的就是x本身~

2、這幾個函數是這幾天用到的函數,組合起來有奇效奧~
首先我們如果在shader裏面畫圓,分爲兩種 第一種是畫內⚪,內圓的意思就是我們得到的是圓內部的顏色,需要用到step函數。step(length(i.uv),r)
r也就是我們想要畫的⚪的半徑,如果想要給這個可愛的⚪塗色就可以在後面乘上fixed4()~
但是現在有點搞不明白的一點是爲什麼黑背景上可以加各色的⚪,但是白背景上不可以???可能是因爲(1,1,1)上加上數都是大於1,因此還是白色~我是這麼理解的啦

如果想要想要畫外⚪,外圓就是我們可以控制圓外的顏色,一般用來畫圓弧,我們只需要控制i.uv.y的大小,具體就是
首先我們令r=i.uv.y
然後r=2r-1;
我們將r的直接當作顏色輸出,對於顏色而言,小於0就是黑色的,因此如果r<1/2,那麼顏色就是黑色,如果r>0.5,那麼就是其他的顏色,因此r就是我們圓的半徑了哈哈哈~

當我們想要畫圓弧的時候,我們需要在r=2r-1;後面再加一句代碼,也就是 r=abs(1/(k*r))
我們如果觀察1/30x的圖像我們就可以發現在r>0.5之後,很快就又趨近於0了,因此我們圓環的寬度和這個k數值有關。在這裏插入圖片描述
最後一個是畫虛線,採用的是step函數和fmod函數

我們舉個例子

fixed4 frag (v2f i) : SV_Target
			{
				float c1 = fmod(i.uv.x, 2.0* 1);//fmod是一個周期函數,以2爲週期,並且值域是(0,2)
				c1 = step(1, c1);//step函數是比較大小的函數,0.1處於(0,2)之間。
				//當fmod函數和step函數組合在一起的時候,隨着i.uv.x逐漸變大,c1的值在0,1之間變化。
				float c2 = fmod(i.uv.y, 2.0* 2);
				c2 = step(1, c2);
				//c2同理,當i.uv.y逐漸變大,c2的值在0,1之間變化。
				fixed4 COLOR1 = fixed4(1, 0, 0, 1);
				fixed4 COLOR2 = fixed4(1, 1, 0, 1);
				fixed4 bg_color = lerp(i.uv.x * COLOR1, i.uv.y * COLOR2, c1*c2);//c1*c2的意思在於需要x和y同時都是1的時候才能上色~
				return bg_color;
			}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章