表面着色器Surface Shader 光照多了用它
顶点/片元着色器 Vertex/Fragment Shader
固定函数着色器 Fixed Function Shader(弃用 老设备可以用)
Shader "jm" {//不用跟文件名保持一致
Properties{
//属性
//属性名 面板名 类型 默认值RGBA
_Color("Color", Color) = (1,1,1,1)
//向量
_Vector("Vector",Vector) = (1,2,3,4)
//整数
_Int("Int",Int) = 222
//小数
_Float("Float",Float) = 4.5
//范围
_Range("Range",Range(1,11)) = 6
//图片 颜色值 没有指定图片 默认白色
_2D("Texture",2D) = "white"{}
//立方体文理
_Cube("Cube",Cube) = "white"{}
//3D纹理
_3D("Texture",3D) = "white"{}
}
//子shader 可以有多个 显卡运行效果的时候 从第一个开始,可以就用第一个,不行就用下一个
SubShader{
//Pass可以多个 相当于方法
Pass{
//在这里编写shader代码
CGPROGRAM //HLSLCGPROGRAM
//使用CG语言编写
float4 _Color;//最多用fixed定义
float4 _Vector;
float _Int;
float _Float;
float _Range;
sampler2D _2D;
samplerCube _Cube;
sampler3D _3D;
//float可以用 half fixed代替
//float 32位
//half 16 -6万~6万
//fixed 11 -2万到2万
ENDCG
}
}
FallBack "Diffuse"
}
Shader "Custom/sssd" {
SubShader{
Pass{
CGPROGRAM
//顶点函数 这只是生名 顶点函数名
//基本作用是完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上)
#pragma vertex vert
//片元函数 这只是声明 片元函数的函数名
//基本做用 返回模型对应的屏幕上的每个像素的颜色值
#pragma fragment frag
//通过语义告诉系统,参数干嘛的,比如POSITION是告诉系统我需要顶点坐标
//SV_POSITION这个语义用来解释返回值,意思是返回值是剪裁空间下的顶点坐标
//获得值 返回的值
//确定坐标
float4 vert(float4 v: POSITION):SV_POSITION {
// 矩阵4*4
float4 pos = mul(UNITY_MATRIX_MVP,v);
return pos;
}
//确定颜色
float4 frag() : SV_Target{
//float _float;
return fixed4(0.8, 0.65, 1, 1);
}
ENDCG
}
}
FallBack "Diffuse"
}
从应用程序传递到顶点函数的语义有哪些a2v
POSITION 顶点坐标(模型空间下)
NORMAL 法线(模型空间下)
TANGENT 切线(模型空间下)
TEXCOORD0~N 纹理坐标
COLOR 顶点颜色
从顶点函数传递给片元函数的时候可以使用的语义
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个
COLOR1 可以传递一组值 4个
TEXCOORD0~7 传递纹理坐标
片元函数传递系统
SV_Target 颜色值,显示到屏幕上的颜色
什么是光照模型
光照模型就是一个公式 使用这个公式来计算光照效果
标准的光照模型
自发光
高光反射
Blinn 光照模型
Specular=直射光pow(max(cos夹角,0),高光参数) 夹角是反射光和视野方向夹角
Blinn-Phong 光照模型(用的多)
Specular=直射光pow(max(cos夹角,0),高光参数) 夹角是法线和x夹角 x是视角方向和平行光线的平分线的
漫反射 兰伯特光照模型: Diffuse=直射光颜色max(cos夹角(光和法线的夹角))
半兰伯特光照模型:Diffuse=直射光颜色(cos夹角*0.5+0.5)
环境光
//只有定义正确的LightMode才能得到一些unity内置光照变量
Tags{“LightMode”=“ForwarBase”}
//包含了unity内置的文件 才可以使用unity内置的一些变量
#include “Lighting.cginc”
normalize()用来把一个向量,单位化(原来方向不变,长度变为1)
max()用来取得函数中最大的一个
dot 用来两个向量的点积
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0 取得平行光的颜色
_World2Object 这个矩阵用来把一个方向从世界空间装换到模型空间
图片纹理 Wrap Mode Repeat重复 Clamp剪切
pixel=(normal+1)/2
normal=pixel*2-1