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了:

 

最后:

效果:

 

 

背光的情况下 全黑了:

 

 

 

 



 

posted @ 2018-11-19 11:31  白纸菇凉  阅读(2455)  评论(0编辑  收藏  举报