Shader入门笔记--随时补充

 

【什么是OpenGL、DirectX】
shader可以认为是一种渲染命令,由openGL或dx解析,来控制渲染图像
OpenGL运用GLSL Shader语言 PC平台
DirectX运用HLSL Shader语言 移动平台 微软出品
英伟达 CG 编写shader(跨平台)

 

【Unity Shader 的分类】
使用的是ShaderLab编写Unity中的Shader

 

1.表面着色器 Surface Shader CPU
2.顶点/片元着色器 Vertex/Fragment Shader GPU
3.固定函数着色器 Fixed Function Shader(弃用)

【属性】
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(1,2,3,4)
_Int("Int",Int)=12
_Float("Float",Float)=1.2
_Range("Range",Range(1,11))=6
_2D("Texture",2D)="white"{}
_Cube("Cube",Cube)="white"{}
_3D("Texture",3D)="red"{}
// float 32位 half 16位[-6w~6w] fixed 11位[-2~2]

【漫反射】兰伯特光照模型
Diffuse=直射光颜色*max(0,cos夹角(光和法线的夹角)) cosθ=光方向*法线方向
【光的方向】
normalize()用来把一个向量,单位化(原来方向保持不变,长度变为1)
max() 用来取得函数中最大的一个
dot() 用来取得两个向量的点积
_WorldSpaceLightPos0 取得第一个平行光的位置
_LightColor0 取得平行光的颜色
UnityObjectToClipPos()这个矩阵用来把坐标从模型空间转换到剪裁空间
_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
UNITY_LIGHTMODEL_AMBIENT.rgb 获取环境光

【半兰伯特光照模型】暗面不为黑色
Diffuse=直射光射线 *(cosθ*0.5+0.5)
【兰伯特光照模型】
Diffuse=直射光颜色*max(0,cos夹角(光和法线的夹角)) cosθ=光方向*法线方向

Tags{"LightMode" = "ForwardBase"}
只有定义了正确的LightMode才能得到一些Unity的内置光照变量
#include "Lighting.cginc"
包含unity的内置的文件,才可以使用unity内置的一些变量

【面的剔除 Cull】
在渲染的时候,默认情况下是只有朝向摄像机的面才会被渲染,可以告诉Unity,我想渲染哪一个朝向的面,
使用Cull命令在计算体积阴影的时候会用到对Cull的操作来计算和物体相交的投影
Cull 有三种
Cull Off 不剔除
Cull Back 剔除背面(背向摄像机的面)
Cull Front 剔除前面 (朝向摄像机的面)


【UnityCG.cginc中一些常用的函数】
//摄像机的方向(视角方向)
float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标,得到(世界空间)从这个点到摄像机的观察方向
float3 UnityWorldspaceViewDir(float4 v)世界中的顶点坐标==》世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
//光源方向
float3 WorldSpaceLigthDir(float4 v) 模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
//方向转换
float3 UnityObjectToWorldNormal(float3 norm)把法线方向 模型空间==》世界空间
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间==》世界空间
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间==》模型空间

 

【SubShader的标签设置】

Queue    控制渲染顺序,指定该物体属于哪一个渲染队列   Tags { “Queue” = “Transparent” }
RenderType     着色器分类,指明使用的着色器对象   Tags { “RenderType” = “Qpaque” }
DisableBatching   指明是否对该SubShader使用批处理(配合Unity批处理)   Tags { “DisableBatching” = “True”}
ForceNoShadowCasting   控制使用该SubShader的物体是否会投射阴影   Tags { “ForceNoShadowCasting” = “True”}
IgnoreProjector   控制使用该SubShader的物体是否不受Projector的影响(常用于半透明物体)   Tags { “IgnoreProjetctor” = “True”}
CanUseSpriteAtlas   该SubShader是否没有被用于sprites(精灵)   Tags { “CanUseSpritesAtlas” = “False”}
PreviewType   材质面板预览该材质的类型,默认为球型。(如 “Plane”、“SkyBox”)   Tags { “PreviewType” = “Plane”}
标签的声明仅在SubShader{}中进行,不可在Pass{}进行。
附注:Pass{}可以声明标签,但声明的标签类型与SubShader{}不同。

【常见的渲染状态设置选项】

Cull   Cull Back/Front/Off   设置剔除模式:剔除 背面/正面/关闭
ZTest   ZTest Less/Greater/LEqual/Equal/NotEqual/Always   设置深度测试使用的函数
ZWrite   ZWrite On/Off   深度写入 开启/关闭
Blend   Blend SrcFactor DstFactor   混合模式 开启并设置

标准着色器代码,附带详细注释

 1 //最基础的shader
 2 
 3 Shader "MyShader/MyShader5_1"
 4 {
 5     //属性
 6     Properties
 7     {
 8     //声明一个Color类型的属性(可在inspector面板看到)
 9     //结构: 内部变量名,(inspector显示名字, 类型) = 默认值
10     _Color ("Color Tint", Color) = (1.0,1.0,1.0,1.0)
11     }
12 
13 
14     //第一个subshader,只会执行一个,根据硬件的高低配置来
15     SubShader
16     {
17         //第一个通道,有多个可执行多个
18         Pass
19         {
20             //CGPROGRAM 表示可编程渲染管线代码开始
21             CGPROGRAM
22 
23             //UnityCG.cginc包含了最常用的函数等等,一般都需要引用上
24             #include "UnityCG.cginc"
25 
26             //顶点着色器的函数名为vert
27             #pragma vertex vert
28             //片元着色器的函数名为frag
29             #pragma fragment frag
30 
31             //要用到属性,需要声明一个类型匹配的变量,名字必须与内部变量名相同
32             fixed4 _Color;
33 
34             //2是to的意思(two的谐音),application to vertex
35             struct a2v
36             {
37                 //POSITION表示应用阶段输入的模型空间顶点坐标
38                 float4 vertex : POSITION;
39                 //表示顶点模型空间的法线
40                 float3 normal : NORMAL;
41                 //表示改顶点的纹理坐标
42                 float4 texcoord : TEXCOORD0;
43                 //更多类型的语义 TANGENT 切线 COLOR 顶点颜色
44             };
45 
46             //vertex to fragment
47             struct v2f
48             {
49                 //pos表示裁剪空间的坐标
50                 //看到网上说SV_position的声明如果不是第一个在手机上会有问题
51                 float4 pos : SV_POSITION;
52                 //COLOR0用来存颜色信息
53                 fixed3 color : COLOR0;
54             };
55 
56             //SV表示system value的意思
57             //SV_POSITION 是表示输出值为顶点着色器的输出值  语义
58             //顶点着色器一般需要把顶点从模型空间转到齐次裁剪空间,还未进行 裁剪 和 透视除法
59             float4 vert(a2v v) :SV_POSITION
60             {
61                 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
62                 return UnityObjectToClipPos(v.vertex);
63             }
64 
65             //CPU
66             //准备好各个顶点的数据 传递给GPU
67 
68             //GPU
69             // ↑ 顶点着色器
70             //裁剪
71             //透视除法
72             //屏幕映射(把未裁剪的顶点映射到屏幕上)
73             //三角形设置,生成三角形,三角形遍历
74             // ↓ 片元着色器
75             //逐片元操作
76 
77 
78             //SV_Target 表示片元着色器的输出值
79             fixed4 frag():SV_Target
80             {
81                 return fixed4(1.0,1.0,1.0,1.0);
82             }
83 
84             //结束
85             ENDCG
86         }
87     }
88 }

 

posted @ 2022-06-21 17:35  木木木林森  阅读(126)  评论(0)    收藏  举报