shader_学习笔记_shaderlab篇
/*
shader 属性的定义:
shader 属性的定义:
什么是材质球?
如:人的衣服,树表面的树皮。
什么是shader?
什么是shader?
决定材质跟光线的作用。
shader属性定义的通用格式:
shader属性定义的通用格式:
properties{property[Property] };
(注意属性定义得时候通常会加入下划线避免命名冲突,如_name);
1, 定义一个int:
_name("display name",Int)=number ;
// _name:变量的名字。通常以下划线开头避免命名冲突。
//display name :供外界 参考说明。
// int:表示变量类型。
// =number 表示默认值
1, 定义一个int:
_name("display name",Int)=number ;
// _name:变量的名字。通常以下划线开头避免命名冲突。
//display name :供外界 参考说明。
// int:表示变量类型。
// =number 表示默认值
2, 定义一个float:
_name ("display name", Float) = number
//跟int型同理
3, 定义一个range:
_name ("display name", Range (min, max)) = number
_name ("display name", Float) = number
//跟int型同理
3, 定义一个range:
_name ("display name", Range (min, max)) = number
//范围区间值
4, CubeMap: 有6个面的纹理,
5, 3D 纹理:1,它只能用script创建。 2,openGL 3.0及以上才支持。
(具体详见官方文档Unity Manual -> Graphics -> Meshes,Materials,Shaders And Textures下shader系列说明)
shader 1.0 :
a,渲染管线:顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。
b,各个管线工作概述:
顶点着色器:
1,计算顶点的颜色。---可改变
2,顶点变换;---shader 1.0固定好的 无法编程。
3,灯光的作用;---可改变
c,旧版顶点灯光:(shader 1.0 灯光设置)
Pass
{
//Color(1,0,0,1) //设置颜色
Material //设置材质颜色
{
//Diffuse(0,0,1,1)
Diffuse[_TestColor]
}
{
//Diffuse(0,0,1,1)
Diffuse[_TestColor]
}
Lighting on
}
1,Color color ;将对象设置为纯色。颜色要么是括号中的四个RGBA值,要么是方括号中的颜色属性名称。
2,Material {Material Block};材料块用于定义对象的材料属性。
3,Lighting On | Off ;为了使“材质”块中定义的设置生效,必须使用“ 照明打开”命令启用“照明” 。如果关闭照明,则直接从“ 颜色”命令中获取颜色。
4,SeparateSpecular On | Off ;此命令可将镜面光照添加到着色器通道的末尾,因此镜面光照不受纹理影响。仅在使用“ 点亮”时有效。
5,ColorMaterial AmbientAndDiffuse | Emission ;使每个顶点的颜色代替材料中设置的颜色。AmbientAndDiffuse替换材质的Ambient和Diffuse值;排放替代物料的排放值。
注:其中包含有关材料对光的反应方式的设置。这些属性中的任何一个都可以忽略,在这种情况下,它们默认为黑色(即无效)。
}
1,Color color ;将对象设置为纯色。颜色要么是括号中的四个RGBA值,要么是方括号中的颜色属性名称。
2,Material {Material Block};材料块用于定义对象的材料属性。
3,Lighting On | Off ;为了使“材质”块中定义的设置生效,必须使用“ 照明打开”命令启用“照明” 。如果关闭照明,则直接从“ 颜色”命令中获取颜色。
4,SeparateSpecular On | Off ;此命令可将镜面光照添加到着色器通道的末尾,因此镜面光照不受纹理影响。仅在使用“ 点亮”时有效。
5,ColorMaterial AmbientAndDiffuse | Emission ;使每个顶点的颜色代替材料中设置的颜色。AmbientAndDiffuse替换材质的Ambient和Diffuse值;排放替代物料的排放值。
注:其中包含有关材料对光的反应方式的设置。这些属性中的任何一个都可以忽略,在这种情况下,它们默认为黑色(即无效)。
6,漫反射颜色:漫反射颜色分量。这是对象的基本颜色。
7,环境颜色:环境颜色分量。这是物体被物体击中时的颜色环境光
在照明窗口中设置。
在照明窗口中设置。
8,镜面颜色:对象的镜面反射高光的颜色。
9,光泽度数:高光的清晰度,介于0和1之间。0时,您会看到一个巨大的高光,看起来很像漫射照明; 1时,您会看到一个小斑点。
10,发射颜色:当物体没有被任何光线照射时的颜色。
11,shader 1.0(旧版)灯光计算公式:
公式: Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
中文译:环境 * 照明窗口的环境强度设置 +(浅色* 漫反射 +浅色* 高光)+ 发射
Ambient: 环境光;
Diffuse: 漫反射;
Specular: 镜面反射;
Emission:自发光;
注:主要操作可看shaderlab文档。
d,旧版shader 1.0 纹理寻址原理:
一,贴纹理:
当大小和需要显示的区域不匹配怎么办?
1,纹理大小跟显示区域相等。
如:显示区域100*100 ;纹理 100*100 ;
2,纹理大于显示区域。
如;显示区域150*150 ;纹理 100*100 ;
3,纹理小于显示区域。
如:显示区域100*100 ;纹理 1024*512 ;
采用等比例映射:
UV:
point: 就近采样。
bilinear:就近周围4个像素的平均。
trilinear:取就近周围8个像素的平均。
shader 2.0:
shader 1.0 和 2.0的区别:
2.0可以实现编程;
相同点:
渲染管线一样;
渲染管线:顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。
11,shader 1.0(旧版)灯光计算公式:
公式: Ambient * Lighting Window’s Ambient Intensity setting + (Light Color * Diffuse + Light Color * Specular) + Emission
中文译:环境 * 照明窗口的环境强度设置 +(浅色* 漫反射 +浅色* 高光)+ 发射
Ambient: 环境光;
Diffuse: 漫反射;
Specular: 镜面反射;
Emission:自发光;
注:主要操作可看shaderlab文档。
d,旧版shader 1.0 纹理寻址原理:
一,贴纹理:
当大小和需要显示的区域不匹配怎么办?
1,纹理大小跟显示区域相等。
如:显示区域100*100 ;纹理 100*100 ;
2,纹理大于显示区域。
如;显示区域150*150 ;纹理 100*100 ;
3,纹理小于显示区域。
如:显示区域100*100 ;纹理 1024*512 ;
采用等比例映射:
UV:
point: 就近采样。
bilinear:就近周围4个像素的平均。
trilinear:取就近周围8个像素的平均。
shader 2.0:
shader 1.0 和 2.0的区别:
2.0可以实现编程;
相同点:
渲染管线一样;
渲染管线:顶点着色器 => 光栅化 => 片段着色器 => alpha 测试 => 模板测试 => 深度测试 => blend => Gbuffer => frontbuffer =>frame buffer =>显示器。
#pragma vertex vert 定义一个顶点着色器的入口函数
#pragma fragment frag 定义一个片段着色器入口函数
Appdata从meshrender里面来的(参数);
v2f vert(appdata v)
v2f: 顶点着色器的输出值,片段着色器的输入值。
语法定义:
(官方文档路径 Unity Manual -> Graphics -> Meshes,Materials,Shaders And Textures ->Writing Shaders -> shader Reference -> writing vertex and fragment shaders 下所有文档)
详见官方文档;writing vertex and fragment shaders 篇
对于Cg / HLSL 顶点程序, 网眼顶点数据作为输入传递到顶点着色器功能。每个输入都需要具有语义:例如,POSITION输入是顶点位置,并且NORMAL是顶点法线。
通常,顶点数据输入是在结构中声明的,而不是一一列出。在UnityCG.cginc包含文件中定义了几种常用的顶点结构,在大多数情况下,只需使用这些顶点结构就足够了。结构为:
appdata_base:位置,法线和一个纹理坐标。
appdata_tan:位置,切线,法线和一个纹理坐标。
appdata_full:位置,切线,法线,四个纹理坐标和颜色。
要访问不同的顶点数据,您需要自己声明顶点结构,或将输入参数添加到顶点着色器。顶点数据由Cg / HLSL 语义标识 ,并且必须来自以下列表:
POSITION是顶点位置,通常是a float3或float4。
NORMAL是顶点法线,通常是float3。
TEXCOORD0是所述第一UV坐标,典型地float2,float3或float4。
TEXCOORD1,TEXCOORD2并且TEXCOORD3是第2,第3和第4个UV坐标。
TANGENT是切线向量(用于法线贴图),通常为float4。
COLOR是每个顶点的颜色,通常是float4。
常用cg结构:(unity文件夹下 editor-> data -> cgIncludes -> unityCG)
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
#pragma fragment frag 定义一个片段着色器入口函数
Appdata从meshrender里面来的(参数);
v2f vert(appdata v)
v2f: 顶点着色器的输出值,片段着色器的输入值。
语法定义:
(官方文档路径 Unity Manual -> Graphics -> Meshes,Materials,Shaders And Textures ->Writing Shaders -> shader Reference -> writing vertex and fragment shaders 下所有文档)
详见官方文档;writing vertex and fragment shaders 篇
对于Cg / HLSL 顶点程序, 网眼顶点数据作为输入传递到顶点着色器功能。每个输入都需要具有语义:例如,POSITION输入是顶点位置,并且NORMAL是顶点法线。
通常,顶点数据输入是在结构中声明的,而不是一一列出。在UnityCG.cginc包含文件中定义了几种常用的顶点结构,在大多数情况下,只需使用这些顶点结构就足够了。结构为:
appdata_base:位置,法线和一个纹理坐标。
appdata_tan:位置,切线,法线和一个纹理坐标。
appdata_full:位置,切线,法线,四个纹理坐标和颜色。
要访问不同的顶点数据,您需要自己声明顶点结构,或将输入参数添加到顶点着色器。顶点数据由Cg / HLSL 语义标识 ,并且必须来自以下列表:
POSITION是顶点位置,通常是a float3或float4。
NORMAL是顶点法线,通常是float3。
TEXCOORD0是所述第一UV坐标,典型地float2,float3或float4。
TEXCOORD1,TEXCOORD2并且TEXCOORD3是第2,第3和第4个UV坐标。
TANGENT是切线向量(用于法线贴图),通常为float4。
COLOR是每个顶点的颜色,通常是float4。
常用cg结构:(unity文件夹下 editor-> data -> cgIncludes -> unityCG)
struct appdata_base {
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_tan {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct appdata_full {
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
顶点着色器:
1,计算顶点位置变换。
2,计算顶点的颜色。
unity3d里面的矩阵是左乘;
1,将物体坐标系变换到世界坐标系;
p(世界) = m(物体到世界的) * p (物体)
规律:3d变换,首先将物体坐标系变换到世界坐标系。
2,将世界坐标系变换到相机坐标系。
p(相机) = m(世界到相机) * p(世界)
结:(矩阵变换)
M :物体坐标系变换到世界坐标系;
V :世界坐标系变换到相机坐标系; --常用
P :将3D坐标系转换成二维屏幕坐标系;
注意:shader2.0 的变量需要引用;
float4 vertex : POSITION;
float4 tangent : TANGENT;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
float4 texcoord1 : TEXCOORD1;
float4 texcoord2 : TEXCOORD2;
float4 texcoord3 : TEXCOORD3;
fixed4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
顶点着色器:
1,计算顶点位置变换。
2,计算顶点的颜色。
unity3d里面的矩阵是左乘;
1,将物体坐标系变换到世界坐标系;
p(世界) = m(物体到世界的) * p (物体)
规律:3d变换,首先将物体坐标系变换到世界坐标系。
2,将世界坐标系变换到相机坐标系。
p(相机) = m(世界到相机) * p(世界)
结:(矩阵变换)
M :物体坐标系变换到世界坐标系;
V :世界坐标系变换到相机坐标系; --常用
P :将3D坐标系转换成二维屏幕坐标系;
注意:shader2.0 的变量需要引用;
*/