1. 程式人生 > >Shader學習筆記_Vertex Shader_幾何變換_波

Shader學習筆記_Vertex Shader_幾何變換_波


這篇文章是根據某Unity教學網站的shader教程來寫的筆記。

由於本人技術水平方面的欠缺可能會有各種各樣嚴重的錯誤,沒有任何參考價值,歡迎各位大佬指正。

本次由於是根據之前的課程中途開始寫的筆記,所以是在先貼出基本的頂點和片段程式碼塊,和操作步驟。

先在Unity中建立Material,shader各一個, 隨你命名什麼  之後在場景中建立一個plane

在shader中新增如下程式碼

Shader "Custom/Wave" {
	SubShader {
	pass{
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		
		struct v2f
		{
			float4 pos:POSITION;	
			float4 col:Color;
		};
		
		v2f vert(appdata_base v)
		{			
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP,v.vertex);  
		    <span style="white-space:pre">	</span>o.col= fixed4(0,1,1,1);
			return o;			
		}
		fixed4 frag(v2f IN):COLOR
		{
			return IN.col;
		}
		
		ENDCG
	    } 
	}
}
還是簡要說一下,Unity一共有三種形態, 固定管線 Shader,  vertex和fragment shader和SubFace shader

對於固定管線Shader,據說已經在unity5.1中已經完全移除,目前所針對的是頂點和片段shader

一般來說頂點函式用於處理頂點位置,大小,片段函式用於處理畫素



目標:頂點和片段shader水波變換

首先在vert函式中加入

		v.vertex.y += sin(_Time.y + _Time.y);
綁上物體後可以看到物體頂點開始上下的移動...這是因為上述程式碼是對所有頂點進行上下運動。

_Time是Cg語言中的內建函式 下表可以看到是float4型別 x,y,z,w分別對應如下,下面的t是時間

之後再更改如下

	<span style="white-space:pre">	</span>v.vertex.y += sin(v.vertex.x + _Time.y);

可以看到plane會沿著 x方向波動,有了似乎是旗幟的效果。

這時可以試著自由更改v.vertex.x為v.vertex.z可以發現會沿z來運動,這時把引數進行乘除法會相應減少波動振幅

咳咳,這似乎好像是一個高中數學叫正弦波的概念……我不太瞭解。

額,看來得看看數學了

然後再試著更改顏色

	 o.col= fixed4(v.vertex.y,v.vertex.y,v.vertex.y,1);

由於之前是根據頂點來變換的,所以顏色引數更改為頂點會隨著波動上下來變色,會出現一點所謂偽光線的效果


但是這個效果仍然不是很好…

據老師說在04年那本CG語言裡提出了用4個正弦波才能模仿出比較好的湖面效果


由於機能限制,我們可以先用兩個正選波,可以把相應行改為

			v.vertex.y += 0.2 * sin((v.vertex.x + v.vertex.z) + _Time.y);		
			v.vertex.y += 0.3 * sin((v.vertex.x - v.vertex.z) + _Time.w);		

可以看到一個斜著的水面效果.



之後如果我研究那本10年前的書,我會試著寫一個四個正弦波的效果。


小提示!

如果你嘗試更改為

<pre name="code" class="plain">v.vertex.y +=  sin(length(v.vertex.xz)*2 + _Time.w);


 會看到一個很噁心的從原心波動的效果! 根據這個自由擴充套件吧! 
 



這是我的第一次在CSDN上寫部落格,之後我會盡量把學習的東西都搬上CSDN上,請大家多多關照。