Shader 第一天講解 Unity3D中面試中常問的shader,只修改定點數和像素


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

 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 }
shader 1

 

 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 }
shader2
 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 }
Shader3
 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 }
shader4

 

 

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 }
Shader的代碼

__________________________________下午上課的部分—————————————

 

傳進來一個坐標 返回一個坐標

 

 

頂點函數:第一種方法,老的方法:

第二種 新的方法:

 

片元函數:

 

改正:

 

a2v:a到v的 簡寫了a To v

坐標
法線
文理坐標:TEXCOOR0

 

 

片元函數的坐標:

 

獲取法線:

改變前三個值:

 

改正部分:

結構體與結構體之間要有分號
最后修改對的

 

 效果出現漸變是因為法線的不同造成的

 

 ————————————————————————
慢反射:

把不用的刪除后,剩下的就是這些:

成果就是這樣:

漫反射公式:

1.拿直射光;

2.入射光方向:

3.坐標向量化:

用fixed3接受:

最終 返回的是顏色:先獲取直射光顏色(

):
光的方向::

獲取法線方向世界坐標系里面的值:向量化,把模型坐標系轉換成世界坐標系

算夾角: 法線方向 ,入射光方向,得到cgubc,  在v2f里添加

 

 

最終的代碼:

效果

 想讓效果更好 不在頂點函數里面渲染,頂點函數執行的次數少


 自己的顏色影響:自己和太陽光共同作用下產生 的效果

 效果

 

——————————————————

受環境光顏色

 

 

 

上邊的實現都是頂點函數拉力實現的 

 ——————————————————————
在片元函數里渲染:

 法線是在a2v里面的 v2f無法用 用一個中間變量方式:

最后返回的顏色就不是f.color了:

 

最后:

效果:

 

 

背光的情況下 全黑了:

 

 

 

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM