Unity Shaders
推薦!!
Unity技術人員的博客:
http://aras-p.info/blog/
?
Unity 中的 Shader 按照使用方式來分的話,分為3種:
- Surface Shader
受光照影響 Cg/HLSL。如果不受光照? 不要使用這種類型。最后這種shader也會自動轉化成 vertex/fragment。
這種 Shader 的存在是由于編寫跟光照交互的代碼不太好寫,Unity專門用這種方式來簡化光照Shader的編寫。會自動生成代碼。
關于 Surface Shader 推薦閱讀:
http://www.cnblogs.com/flappy/archive/2012/08/10/2631348.html
http://aras-p.info/blog/2010/07/16/surface-shaders-one-year-later/
?
- Vertex/Fragment
如果不需要受光照的話 就使用這種類型。這種方式最靈活。靈活也就意味著比較麻煩。 Cg/HLSL。
使用方法:直接在 Pass 中插入 Cg 代碼。CGPROGRAM...ENDCG
- Fixed Function
老顯卡。固定渲染管線。如果你編寫過 Direct3D 或者 OpenGL 的固定管線的程序,會發現很像。
?
ShaderLab 是什么東西
Unity自定義的一套shader語法。類似與 CgFX 以及 Direct3D 的 FX 文件,描述了材質。
不管你選擇使用哪一種 Shader (就是上面列出的3種),你都是用 ShaderLab 的語法來寫的。
?
shader定義屬性,可以在Inspector中顯示。
SubShader
表示適用于某個顯卡的 shader。可以寫多個,以匹配多種顯卡。編寫的順序是 高端->中端->低端。Unity會自動選擇第一個可以用的 SubShader。
Pass
在一個 SubShader中 可以包含多個 Pass,這些 Pass 會從上到下一個一個執行下去。
Fallback
如果你的SHADER中任何一個SubShader都不被當前機器支持。那么你可以使用這個命令讓他使用另一個Shader里面的 SubShader。就好像把他的內容拷貝進來了似的。
引用其他文件的Pass
如果你的 Pass 別人已經寫了跟你一模一樣的。可以使用 UsePass 命令去引用另一個文件中的 Pass。
如何判斷是使用固定管線還是編程管線
如果在 Pass? 使用了 vertex或者fragment。固定管線中的相應功能就會被關閉。vertex->3d變換(x).光照(x).紋理坐標自動生成(x)? fragment->SetTexture(x)
?
Shader文件的基本組成
// 定義 Shader 的名字 Shader "Custom/BasicDiffuse" {// 1個 Property 部分 Properties {}// 若干個 SubShader(至少1個) SubShader {// 每個 SubShader 中包含若干個 Pass(至少1個) Pass {}}SubShader {} }?Surface Shader的編寫
這幾篇文檔需要一起看:
http://docs.unity3d.com/Manual/SL-SurfaceShaders.html
http://docs.unity3d.com/Manual/SL-SurfaceShaderExamples.html
http://docs.unity3d.com/Manual/SL-SurfaceShaderLightingExamples.html
1. vertex/fragment的 CGPROGRAM...ENDCG 是在 Pass 段中的? 而 Surface 是在 SubShader 中的。
2. 使用 #pragma surface ... 來標識這是一個 Surface Shader
?
轉載于:https://www.cnblogs.com/answerwinner/p/3795263.html
總結
以上是生活随笔為你收集整理的Unity Shaders的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Mysql 学习路线图】
- 下一篇: 比较常用的几个正则表达式