Shader学习一
首先贴上最主要的学习资料链接,作者是浅墨,感觉受益匪浅
shader学习资料
Shader "Shader真好玩/真TM好玩/MyFirstShader" //在选择菜单里面显示的值
{
Properties
{
//显示在面板中的值,可以在面板上自行调整
// 在脚本中引用名称("编辑器中显示名称",类型)=初值
// name ("display name", Range (min, max)) =number
// 定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。
// name ("display name", Color) =(number,number,number,number)
// 定义颜色属性
// name ("display name", 2D) = "name" {options }
// 定义2D纹理属性
// name ("display name", Rect) = "name"{ options }
// 定义长方形(非2次方)纹理属性
// name ("display name", Cube) = "name"{ options }
// 定义立方贴图纹理属性
// name ("display name", Float) = number
// 定义浮点数属性
// name ("display name", Vector) =(number,number,number,number)
// 定义一个四元素的容器(相当于Vector4)属性
_Color ("主颜色", Color) = (1,1,1,0)
_SpecColor ("高光颜色", Color) = (1,1,1,1)
_Emission ("自发光颜色", Color) = (0,0,0,0)
_Shininess ("光泽度", Range (0.01, 1)) = 0.7
_MainTex ("基本纹理", 2D) = "white" {}
}
SubShader
{
Pass
{
// 这些代码一般是写在Pass{ }中的,细节如下:
// Color Color
// 设定对象的纯色。颜色即可以是括号中的四值(RGBA),也可以是被方框包围的颜色属性名。
// Material { Material Block }
// 材质块被用于定义对象的材质属性。
// Lighting On | Off
// 开启光照,也就是定义材质块中的设定是否有效。想要有效的话必须使用Lighting On命令开启光照,而颜色则通过Color命令直接给出。
// SeparateSpecular On | Off
// 开启独立镜面反射。这个命令会添加高光光照到着色器通道的末尾,因此贴图对高光没有影响。只在光照开启时有效。
// ColorMaterial AmbientAndDiffuse | Emission
// 使用每顶点的颜色替代材质中的颜色集。AmbientAndDiffuse 替代材质的阴影光和漫反射值;Emission 替代 材质中的光发射值。
//-----------材质------------
Material
{
// 如下这些代码的使用的地方是在SubShader中的一个Pass{ }中新开一个Material{ }块,在这个Material{ }块中进行这些语句的书写。这些代码包含了包含材质如何和光线产生作用的一些设置。这些属性默认为值都被设定为黑色(也就是说不产生作用),也就是说他们一般情况下可以被忽略。当然,还是有很多时候需要使用到他们的。
// Diffuse Color(R,G,B,A)
// 漫反射颜色构成。这是对象的基本颜色。
// Ambient Color(R,G,B,A)
// 环境色颜色构成.这是当对象被RenderSettings.中设定的环境色所照射时对象所表现的颜色。
// Specular Color(R,G,B,A)
// 对象反射高光的颜色。(R,G,B,A)四个分量分别代表红绿蓝和Alpha,取值为0到1之间。
// Shininess Number
// 加亮时的光泽度,在0和1之间。0的时候你会发现更大的高亮也看起来像漫反射光照,1的时候你会获得一个细微的亮斑。
// Emission Color
// 自发光颜色,也就是当不被任何光照所照到时,对象的颜色。(R,G,B,A)四个分量分别代表红绿蓝和Alpha,取值为0到1之间。
// 而打在对象上的完整光照颜色最终是:
// FinalColor=
// Ambient * RenderSettings ambientsetting + (Light Color * Diffuse + Light Color *Specular) + Emission
// 翻译过来的中文式子便是:
// 最终颜色=环境光反射颜色* 渲染设置环境设置 *(灯光颜色*漫反射颜色+灯光颜色*镜面反射颜色)+自发光
// 知道了这个式子,我们就知道了,在各种光的综合作用下,我们材质最终的颜色是怎么来的了。
// 需要注意的是:方程式的灯光部分(也就是带括号的部分)对所有打在对象上的光线都是重复使用的。而我们在写Shader的时候常常会将漫反射和环境光光保持一致(所有内置Unity着色器都是如此)。
//可调节的漫反射光和环境光反射颜色
Diffuse [_Color]
Ambient [_Color]
//光泽度
Shininess [_Shininess]
//高光颜色
Specular [_SpecColor]
//自发光颜色
Emission [_Emission]
}
//开启光照
Lighting On
//开启独立镜面反射
SeparateSpecular On
//设置纹理并进行纹理混合
SetTexture [_MainTex]
{
Combine texture * primary DOUBLE, texture * primary
}
}
}
}
几个碎碎的知识点:
一.三种着色器:
1.固定功能着色器(Fixed Function Shader)
2.表面着色器(Surface Shader)
3.顶点着色器&片段着色器 (Vertex Shader & Fragment Shader)
区分:没有嵌套CG语言,也就是代码段中没有CGPROGARAM和ENDCG关键字的,就是固定功能着色器。
嵌套了CG语言,代码段中有surf函数的,就是表面着色器。
嵌套了CG语言,代码段中有#pragma vertex name和 #pragma fragment frag声明的,就是顶点着色器&片段着色器
二.贴图、纹理和材质
大致上的层级关系是:
材质 Material包含贴图 Map,贴图包含纹理 Texture。
三.光照和材质
Material Block 材质块:
主要包含材质如何和灯光产生作用,以下属性就是对于灯光色彩的反应属性:
1、Diffuse (R, G, B, A)/[变量名(一定是颜色变量)]
表示材质块中漫反射的颜色,也是物体的基础色彩;
2、Specular (R, G, B, A)/[变量名(一定是颜色变量)]
表示在漫反射的基础上叠加上高光色彩;
3、Shininess Number/[变量(一定是一个float类型的)]
表示对高光的光泽度的改变,范围在0.0 - 1.0之间,0的时候会出现更大的高光反射,1的时候会获得一个细微的亮斑;
4、Amibent (R, G, B, A)/[变量名(一定是颜色变量)]
表示环境光色彩的影响;
5、Emission (R, G, B, A)/[变量名(一定是颜色变量)]
自发光色彩,当不被任何光照照射的时候的一种颜色;
材质块中颜色的影响关系:
Emission颜色是最高等级的颜色,他可以覆盖掉漫反射颜色,如果没有Emission的存在,漫反射才是主要颜色:
最终色彩的生成公式:
Amibent Color * Render Setting菜单下的环境光颜色 + (Light Color * Diffuse Color + Light Color * Specular Color) + Emission;
后面还有啥琐碎知识点就在这里进行补充~