// 這里指定shader的名字,不要求跟文件名保持一致
Shader "Test/UnityShader結構"
{
Properties
{
// 屬性
_Color("Color",Color)=(1,1,1,1) //float4
_Vector("Vector",Vector)=(1,2,3,4) //float4
_Int("Int",Int)= 34234 //float
_Float("Float",Float) = 4.5 //float
_Range("Range",Range(1,11))=6 //float
_2D("Texture",2D) = "red"{} //sampler2D
_Cube("Cube",Cube) = "white"{} //samplerCube
_3D("Texure",3D) = "black"{} //sampler3D
// 內部變量名("界面名稱",屬性類型)=屬性默認值;
}
//SubShader(子著色器)可以寫很多個 顯卡運行效果的時候,從第一個SubShader開始,如果第一個SubShader里面的效果都可以實現,那么就使用第一個SubShader,如果顯卡這個SubShader里面某些效果它實現不了,它會自動去運行下一個SubShader
SubShader
{
// 著色器修飾 硬件將通過判定這些標簽來決定什么時候調用該著色器。包括以下類型:
// RenderType渲染方式
// Opaque:不透明(法線、自發光、反射、地形Shader)
// Transparent:半透明(透明、粒子、字體、地形添加通道Shader)
// TransparentCutout:遮罩透明(透明裁切、雙通道植物Shader)
// Background:天空盒Shader
// Overlay:GUI紋理、光暈、閃光Shader
// TreeOpaque:地形引擎——樹皮
// TreeTransparentCutout:地形引擎——樹葉
// TreeBillboard:地形引擎——公告牌(始終面向攝像機)式樹木
// Grass:地形引擎——草
// GrassBillboard:地形引擎——公告牌(始終面向攝像機)式草
// Queue 指定渲染順序隊列:
// Background 通常用于SkyBox;
// Geometry 最常用的一種,用來渲染非透明物體(普通情況下,場景中的絕大多數物體應該是非透明的)
// AlphaTest - 用來渲染經過Alpha Test的像素,單獨為AlphaTest設定一個Queue是出于對效率的考慮
// Transparent 以從后往前的順序渲染透明物體
// Overlay 用來渲染疊加的效果,是渲染的最后階段(比如鏡頭光暈等特效)
// “ForceNoShadowCasting”=”True” 從不產生陰影
Tags { "RenderType"="Opaque" }
// LOD是Level of Detail的縮寫,在這里例子里我們指定了其為200(其實這是Unity的內建Diffuse著色器的設定值)。這個數值決定了我們能用什么樣的Shader。
// VertexLit及其系列 = 100
// Decal, Reflective VertexLit = 150
// Diffuse = 200
// Bumped VertexLit = 250
// Bumped, Specular = 300
// Bumped Specular = 400
// Parallax = 500
// Parallax Specular = 600
LOD 100
//至少有一個Pass
Pass
{
// 這里還會標注RenderState.設定顯示各種狀態:
// Cull ( Back,Front,Off) 設置多邊形剔除模式
// ZTest (Less,Greater,LEqual,GEqua,Equal,NotEqual,Always) 默認是LEqual.
// ZWrite (On,Off) 設置深度寫模式,是否此物體的像素深度會被記錄(默認記錄) Off,通常用于半透明物體。
// AlphaTest(Less,Greater,LEqual,GEqual,Equal,NotEqual,Always) 開啟alpha測試
// Blend SourceB./endMode DestB/endMode 設置alpha混合模式。(以下為相關屬性說明)
// One 值為1,使用此設置來讓源或是目標顏色完全的通過。
// Zero 值為0 ,使用此設置來刪除源或目標值。
// SroColor 此階段的值是乘以源顏色的值。
// SrcAlpha 此階段的值是乘以源alpha的值。
// DstColor 此階段的值是乘以幀緩沖區源顏色的值。
// DstAlpha 此階段的值是乘以幀緩沖區源alpha的值。
// OneMinusSrcColor 此階段的值是乘以(1-source color)
// OneMinusSrcAlpha 此階段的值是乘以(1-source alpha)
// OneMinusDstColor 此階段的值是乘以(1-destination color)
// OneMinusDstAlpha 此階段的值是乘以(1-destination alpha)
//在這里編寫shader代碼 HLSLPROGRAM
CGPROGRAM//使用CG語言編寫shader代碼
// 聲明一個以vert為名字的函數的頂點程序
#pragma vertex vert
// 聲明一個以frag為名字的函數的片元程序。
#pragma fragment frag
// 可選
// #pragma surface name 聲明一個以name為名字的函數表面shader;
// #pragma vertex name 聲明一個個以name為名字的函數的頂點程序
// #pragma fragment name- 聲明一個個以name為名字的函數的片段程序。
// #pragma fragmentoption option - 添加選項到編譯的OpenGL 片段程序。 通過 ARB 片段程序 可以查詢到所允許的規范的選項列表。 這個指令對頂點程序或者不是以OpenGL為編譯目標的程序無效。
// #pragma target name -著色器目標編譯。詳情請參考 著色器目標。
// #pragma only_renderers space separated names - 僅用給定的渲染器編譯著色器。默認情況下用所有的渲染器都編譯著色器。
// #pragma exclude_renderers space separated names -不用給定的渲染器編譯著色器。 默認情況下用所有的渲染器都編譯著色器。
// #pragma glsl - 用桌面OpenGL平臺編譯著色器時,轉換成GLSL里面的Cg/HLSL(而不是默認設置的ARB頂點/片段程序)。
// #pragma surface surf Standard fullforwardshadows
// Use shader model 3.0 target, to get nicer looking lighting
// #pragma target 3.0 //編譯著色器模式3.0
// Mac上的位置 /Applications/Unity/Unity.app/Contents/CGIncludes
// Win上的位置 Unity的安裝路徑/Data/CGIncludes
#include "UnityCG.cginc"
// 結構體
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
// 結構體
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
// 頂點入口函數
v2f vert (appdata v)
{
v2f o;
// 內置函數http://blog.csdn.net/qingshui37/article/details/51476404
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
// 片元入口函數
fixed4 frag (v2f i) : SV_Target
{
// sample the texture
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
// 結束CG程序
ENDCG
}
}
Fallback "VertexLit" //返回值
}
UnityShader學習筆記—UnityShader結構
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
推薦閱讀更多精彩內容
- 概述 新接觸 React Native,本文算是個筆記 環境配置 React Native中文網的環境配置http...
- [機器學習入門] 李宏毅機器學習筆記-24(introduction of Structured Learning...
- [機器學習入門] 李宏毅機器學習筆記-27(Structured SVM part 2;結構化支持向量機 part...