1. 程式人生 > >好,Unity Shader的從找門到入門教程= =

好,Unity Shader的從找門到入門教程= =

 好的。當需求對我這個可憐的小貓咪下手的時候,拿棒槌逼著我去寫Shader的時候,打死我也不會屈服的[○・`Д´・ ○]!

//Shader名稱:
//1.固定寫法:Shader"XXX/XXX"
//2./表示層級,與C#指令碼不同的是Shader名稱和外面的檔名沒有關係
Shader"MyShader/MyShader1"
{
	//屬性:
	//1.固定寫法:Properties{XXX}
	//2.在這裡宣告的變數會顯示在使用此Shader的材質球的面板上
	//3.此處宣告的變數需要初始化,不初始化會報錯
	//4.此處宣告語句不需要加';'
	//5.結構:_Name("ShowName",Type)
	//		①_Name:在此Shader中使用且在外部賦值Shader變數時使用的變數
	//		②ShowName:在材質球面板上顯示的名稱
	//		③Type:此變數的型別。
	Properties{
		//Float:浮點型
		//此外還有常用的Float陣列,但是無法在此處定義
		//Float/Float2/Float3/Float4 後面數字表示能存放的值的數量
		_Float("Float",Float) = 0.5
		//Int:整數
		//雖然是Int值,但是如果你在外面的材質球上也能寫浮點數
		//但是指令碼中就不闊以了
		_Int("Int",Int) = 5
		//Range:此變數的取值範圍,型別亦為Float
		_Range("Range",Range(0,100)) = 30
		//Vector:四維向量
		//取值為(x,y,z,w)
		_Vector("Vector",Vector) = (0,0,0,0)
		//Color:顏色型別
		_Color("Color",Color) = (0,0,0,1)
		//圖片紋理:先設定一個顏色,{}中放置圖片紋理
		//TODO:待找到理論依據
		//顏色值無法改變,且無法在外面賦值,只能是在這裡預設的
		_2D("2D",2D) = "white"{}
		//Cube:立方體紋理 立方體貼圖(不知道有什麼用,手動狗頭=3=)
		_Cube("Cube",Cube) = "white"{}
		//3D:3D紋理(不知道有什麼用,手動狗頭=3=)
		_3D("3D",3D) = "white"{}
	}

	//放程式碼塊的地方
	SubShader{
		//至少含有一個Pass
		//一個Pass代表一個處理流程
		//一般應該有多個Pass來處理在不同裝置上的顯示效果
		//一般從上至下,效果越來精簡,所以最上方的Pass塊一般為最秀的
		Pass{
			//又回到最初的起點,可以開始寫程式碼了
			CGPROGRAM
			//在這裡搞CG語言程式碼

			//在這裡再宣告上面設定的變數才能在Pass塊中使用
			//在這裡宣告的變數後面需要加';'
			Float _Float;
			//Int比較神奇。
			//我也不太清楚我是不是有別的操作影響到Int大佬的心情了,但是我的確碰到了個問題。
			//如果在Pass塊中聲明瞭vertex 且 聲明瞭 fragment 函式
			//這個地方就不能宣告Int變量了,不然就會報錯。
			//但是單獨宣告其中一個沒有問題,但是應該沒有獨自使用這些函式的情況bia= =
			//就需要寫為一下情況:
			//Float _Int;
			Int _Int;
			Float _Range;
			Vector _Vector;
			Color _Color;
			2D _2D;
			Cube _Cube;
			3D _3D;

			//陣列:
			//Properties塊中木有辦法寫陣列,所以也就沒有辦法通過在Properties塊中宣告陣列
			//然後賦值的方法來使用外部的陣列
			//那怎麼整???
			//因為Unity在較低版本中還沒有整合所以只能通過別的辦法來解決
			//可以在Pass塊中宣告需要使用的陣列
			//然後在指令碼中直接賦值的方法來實現
			//但是這個辦法在unity5之前不好使
			//因為專案原因我試用的是unity4.x的版本,相應指令碼中並沒有相應的方法
			//所以此方法只能在Unity5之後使用(我用5.6.0f3開啟裡面是含有相應的函式的)
			//之前的專案怎麼辦?
			//升級版本吧,小老弟,或者壓縮這個需求量控制在可操作的範圍內=3=
			//此外:陣列的長度必須是固定的無法修改,所以需要提前先按照需求設計好
			uniform Float[100] _FloatList;
			uniform Vector[100] _VectorList;

			ENDCG
		}
	}
	//備用方案:上述Pass塊,全都使不了,就使介個。
	FallBack "Diffuse"
}

真香( • ̀ω•́ )✧。

感謝以下文章嗎,為我提供了短時間內的解決方案:

這哥們的五篇文章都由詳細的註釋,這是最舒服的= =,感恩

這哥們提供的溫度雲圖解決方案,為我提供了思路,使我理解了其中的一些內容

感謝這個哥們,提供了關鍵性技術=3=

感恩這個哥們,文章挺細的,比較系統化,提供了很深的理解,並且他的外掛很有用,配合UI實現的展示功能

感謝以上但不限於的哥們們,因為有的文章我看完了忘收藏了ヾ(๑╹◡╹)ノ"

以後有機會我一定不會看Shader的書的ヽ(#`Д´)ノ!

(好,留下個真香Flag= =督促自己學習,手動狗頭(๑>ڡ<)✿ )