---恢復內容開始---

1 晏姣 2018/11/19 18:43:59 2 Shader "Shader1" //名稱和路徑 3 { 4 Properties//屬性 5 { 6 _Color("_Color",Color)=(1,1,1,1) 7 //變量名 標簽 類型 初始值 8 _Vector("_Vector",Vector)=(1,2,3,4) 9 _int("_Int",int)=100 10 _float("Float",float)=3.14 11 _Range("Range",Range(1,10))=6 12 _2D("Texture",2D)="white"{}//2D圖片變量 13 _3D("Texture",3D)="black"{} 14 } 15 SubShader//可以有很多個 顯卡運行時 從第一個開始運行 16 { 17 Pass //Pass塊相當於一個方法 至少有一個Pass 18 { 19 CGPROGRAM 20 //在CG中重新定義變量 21 fixed4 _Color; 22 float4 _Vector; 23 float _int; 24 float _float; 25 float _Range; 26 sampler2D _2D; 27 sampler3D _3D; 28 //half fixed float 可以互相代替 29 //float 32存儲 half 16存儲 -6W到 6W 30 //fixed 11存儲 -2到 +2 31 //頂點函數 片元函數 32 #pragma vertex vert //聲明頂點函數 33 #pragma fragment frag //聲明片元函數 34 struct a2v 35 { //application vert 36 float4 vectex:POSITION; 37 float3 normal:NORMAL; 38 float4 texcoord:TEXCOORD0; //紋理坐標 39 }; 40 struct v2f 41 { 42 float4 position:SV_POSITION; 43 float3 temp:COLOR; 44 }; 45 46 v2f vert(a2v v) 47 //Position是對參數的解釋 SV_POSITION是對返回值的解釋 48 { 49 //float4 pos=mul(UNITY_MATRIX_MVP.v);//轉換屏幕坐標 50 //float4 pos=UnityObjectToClipPos(v); 51 //return pos; 52 float4 pos=UnityObjectToClipPos(v.vectex); 53 v2f f; 54 f.position=pos; 55 f.temp=v.normal; 56 return f; 57 } 58 fixed4 frag(v2f f):SV_Target 59 { 60 return fixed4(1,1,1,1); 61 } 62 ENDCG 63 } 64 } 65 66 }

1 Shader "Shader2" //名稱和路徑 2 { 3 Properties//屬性 4 { 5 _Color("_Color",Color)=(1,1,1,1) 6 //變量名 標簽 類型 初始值 7 _Vector("_Vector",Vector)=(1,2,3,4) 8 _int("_Int",int)=100 9 _float("Float",float)=3.14 10 _Range("Range",Range(1,10))=6 11 _2D("Texture",2D)="white"{}//2D圖片變量 12 _3D("Texture",3D)="black"{} 13 } 14 SubShader//可以有很多個 顯卡運行時 從第一個開始運行 15 { 16 Pass //Pass塊相當於一個方法 至少有一個Pass 17 { 18 CGPROGRAM 19 //在CG中重新定義變量 20 fixed4 _Color; 21 float4 _Vector; 22 float _int; 23 float _float; 24 float _Range; 25 sampler2D _2D; 26 sampler3D _3D; 27 #pragma vertex vert //聲明頂點函數 28 #pragma fragment frag //聲明片元函數 29 #include "Lighting.cginc"//獲取第一個直射光 30 struct a2v 31 { 32 float4 vectex:POSITION; 33 float3 normal:NORMAL; 34 }; 35 struct v2f 36 { 37 float4 position:SV_POSITION; 38 fixed3 color:COLOR; 39 }; 40 v2f vert(a2v v) 41 { 42 v2f f; 43 f.position=UnityObjectToClipPos(v.vectex); 44 //_WorldSpaceLightPos0.xyz 獲取光的方向 45 fixed3 normalDir=UnityObjectToWorldNormal(v.normal); 46 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 47 fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir)); 48 f.color=diffuse; 49 return f; 50 } 51 fixed4 frag(v2f f):SV_Target 52 { 53 return fixed4(f.color,1); 54 } 55 ENDCG 56 } 57 } 58 59 }

1 Shader "Shader2" //名稱和路徑 2 { 3 Properties//屬性 4 { 5 _Color("_Color",Color)=(1,1,1,1) 6 //變量名 標簽 類型 初始值 7 _Vector("_Vector",Vector)=(1,2,3,4) 8 _int("_Int",int)=100 9 _float("Float",float)=3.14 10 _Range("Range",Range(1,10))=6 11 _2D("Texture",2D)="white"{}//2D圖片變量 12 _3D("Texture",3D)="black"{} 13 } 14 SubShader//可以有很多個 顯卡運行時 從第一個開始運行 15 { 16 Pass //Pass塊相當於一個方法 至少有一個Pass 17 { 18 CGPROGRAM 19 //在CG中重新定義變量 20 fixed4 _Color; 21 float4 _Vector; 22 float _int; 23 float _float; 24 float _Range; 25 sampler2D _2D; 26 sampler3D _3D; 27 #pragma vertex vert //聲明頂點函數 28 #pragma fragment frag //聲明片元函數 29 #include "Lighting.cginc"//獲取第一個直射光 30 struct a2v 31 { 32 float4 vectex:POSITION; 33 float3 normal:NORMAL; 34 }; 35 struct v2f 36 { 37 float4 position:SV_POSITION; 38 fixed3 color:COLOR; 39 }; 40 v2f vert(a2v v) 41 { 42 v2f f; 43 f.position=UnityObjectToClipPos(v.vectex); 44 //_WorldSpaceLightPos0.xyz 獲取光的方向 45 fixed3 normalDir=UnityObjectToWorldNormal(v.normal); 46 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 47 fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir)); 48 f.color=diffuse; 49 return f; 50 } 51 fixed4 frag(v2f f):SV_Target 52 { 53 return fixed4(f.color,1); 54 } 55 ENDCG 56 } 57 } 58 59 }

1 晏姣 2018/11/19 18:44:43 2 Shader "Shader4" //名稱和路徑 3 { 4 Properties//屬性 5 { 6 _Color("_Color",Color)=(1,1,1,1) 7 //變量名 標簽 類型 初始值 8 _Vector("_Vector",Vector)=(1,2,3,4) 9 _int("_Int",int)=100 10 _float("Float",float)=3.14 11 _Range("Range",Range(1,10))=6 12 _2D("Texture",2D)="white"{}//2D圖片變量 13 _3D("Texture",3D)="black"{} 14 } 15 SubShader//可以有很多個 顯卡運行時 從第一個開始運行 16 { 17 Pass //Pass塊相當於一個方法 至少有一個Pass 18 { 19 CGPROGRAM 20 //在CG中重新定義變量 21 fixed4 _Color; 22 float4 _Vector; 23 float _int; 24 float _float; 25 float _Range; 26 sampler2D _2D; 27 sampler3D _3D; 28 #pragma vertex vert //聲明頂點函數 29 #pragma fragment frag //聲明片元函數 30 #include "Lighting.cginc"//獲取第一個直射光 31 struct a2v 32 { 33 float4 vectex:POSITION; 34 float3 normal:NORMAL; 35 }; 36 struct v2f 37 { 38 float4 position:SV_POSITION; 39 fixed3 color:COLOR; 40 41 }; 42 v2f vert(a2v v) 43 { 44 v2f f; 45 f.position=UnityObjectToClipPos(v.vectex); 46 47 //_WorldSpaceLightPos0.xyz 獲取光的方向 48 f.color=UnityObjectToWorldNormal(v.normal); 49 return f; 50 } 51 fixed4 frag(v2f f):SV_Target 52 { 53 fixed normalDir=f.color; 54 fixed3 lightDir=normalize(_WorldSpaceLightPos0.xyz); 55 fixed3 diffuse=_LightColor0.rgb*max(0,dot(lightDir,normalDir))*_Color.rgb; 56 //fixed3 envoment=UNITY_LIGHTMODEL_AMBIENT.rgb;//環境光 57 fixed3 tempColor=diffuse; 58 return fixed4(tempColor,1); 59 } 60 ENDCG 61 } 62 } 63 64 }
1.通過網格,告訴物體長什么樣子:
2.渲染出來
3.通過材質球,獲取顏色
5.講解shader的文章地址:https://blog.csdn.net/jxw167/article/details/54695181
顯卡又交GPU:獨立顯卡和集成顯卡,cpu圖形的處理,渲染一起就會卡
6.計算機渲染中,主要是通過三角形拼出來的:
7.通過這四步,將模型畫出來:
顯存:就是顯卡,如12G
10.可編程渲染管線:只有頂點處理和像素處理:(用shader來編寫)
二:shader如何通過代碼實現的:
1.創建如圖:
2.shader的腳本是用cg語言來寫的,英偉達創造的,可跨平台,到別的平台后,需要不同的東西進行解析,
手機平台:OpenGL來解析
Pc端:DirectX解析
3.第一步,刪除里面的所有代碼
三、
2.。刪除里面原本內容:
3.。制定路徑名稱
這兩個名字可以不一樣:
5.添加屬性:Properties
SubShader:運行顯卡的時候,運行的是里面東西,相當於main函數,它 可以有很多個:
從上往下運行:
Fallback:shader的最后保障,前邊不可運行,最后運行這一個:
標簽命名可以不一樣,變量名:
變量名(標簽,類型)=四元素:Shader沒有分號
接下來就是一個類里面,去實現一個方法:指定那一塊兒是CG代碼:
屬性里的東西:VEctor,intfloat類型:
效果如圖:
2D圖片變量:
總的代碼:
效果:
前邊只定義了,沒有初始化,到方法里面重新定義。變量名要一致:
裝四個變量,就用float4,CG里面有分號:
CG里存數值:區別就是大小的區別:half fxed float
避免浪費空間:顏色最大是1,所以換個類型:
上邊的代碼部分:

1 Shader"Shader_1"//名稱和路徑 2 { 3 Properties//屬性 4 { 5 _Color("Color",Color) = (1,1,1,1) 6 //變量名 標簽 類型 初始值 7 _Vector("Vector",Vector) = (1,2,3,4) 8 _int("int",int)=100 9 _float("Float",float) = 3.14 10 _Range("Range",Range(1,10)) = 6 11 _2D("Texture",2D)="white"{}//2D圖片變量 12 _3D("Texture",3D) = "black"{} 13 14 } 15 SubShader//可以有多個 顯卡運行時 從第一個開始運行 16 { 17 Pass//Pass相當於一個方法 至少有一個Pass 18 { 19 CGPROGRAM//裝cg的代碼部分 20 //在CG中重新定義變量 21 fixed4 _Color; 22 float4 _Vector; 23 float _int; 24 float _float; 25 float _Range; 26 sampler2D _2D; 27 sampler _3D; 28 //half fixed float 可以互相替換 29 //float 32存儲 half16存儲 -6W到6萬 30 //fixed 11存儲 -2到+2; 31 ENDCG 32 33 } 34 } 35 Fallback"VertexLit"//如果所有SubShader都不能運行,執行Fallback 36 }
__________________________________下午上課的部分—————————————
傳進來一個坐標 返回一個坐標
頂點函數:第一種方法,老的方法:
第二種 新的方法:
片元函數:
改正:
a2v:a到v的 簡寫了a To v
坐標
法線
文理坐標:TEXCOOR0
片元函數的坐標:
獲取法線:
改變前三個值:
改正部分:
結構體與結構體之間要有分號
最后修改對的
效果出現漸變是因為法線的不同造成的
————————————————————————
慢反射:
把不用的刪除后,剩下的就是這些:
成果就是這樣:
漫反射公式:
1.拿直射光;
2.入射光方向:
3.坐標向量化:
用fixed3接受:
最終 返回的是顏色:先獲取直射光顏色(
):
光的方向::
獲取法線方向世界坐標系里面的值:向量化,把模型坐標系轉換成世界坐標系
算夾角: 法線方向 ,入射光方向,得到cgubc, 在v2f里添加
最終的代碼:
效果
想讓效果更好 不在頂點函數里面渲染,頂點函數執行的次數少
自己的顏色影響:自己和太陽光共同作用下產生 的效果
效果
——————————————————
受環境光顏色
上邊的實現都是頂點函數拉力實現的
——————————————————————
在片元函數里渲染:
法線是在a2v里面的 v2f無法用 用一個中間變量方式:
最后返回的顏色就不是f.color了:
最后:
效果:
背光的情況下 全黑了: