Shader
Fixed shader: shader1.0 固定管线
Vertex/Fragment shader : shader 2.0 顶点/片段
Surface shader :Unity3d 特有的 表面
Shader1.0
开关式编程
最终呈现效果计算公式
环境光 * Unity环境光设置 +
漫反射 * 灯光的颜色 +
镜面反射 * 灯光的颜色 +
自发光
流水线
过程:
- 顶点着色器
- 光栅化
- 片段着色器
- alpha测试
- 模板测试
- 深度测试
- blend
- gbuffer
- framebuffer
- frontbuffer
- 显示器
shader1.0
开关式编程
shader2.0
能够编程的
- 顶点着色器
- 计算顶点的位置 MVP:以相机为坐标系,超框不显示;
- 计算顶点的大小
- 计算顶点的颜色
- 光栅化:
- 将顶点变成像素 (计算插值)
- 片段(像素)着色器
- 计算像素颜色
- 结合灯光计算像素的颜色
- 结合贴图计算像素的颜色
- alpha测试
- 淘汰像素 RGBA:根据a值淘汰i像素
- 深度测试
- 根据深度值淘汰像素(离相机远近)
- 模板测试
- 程序自定义的值淘汰像素
- 分辨率:1280720 float[1280720] RGBA:32bit,
- 颜色缓存区(RGBA float[1280720]),深度缓存区(深度值8bit Byte[1280720] 或 short[1280720]) 模板缓存区(模板值8bit Byte[1280720]):
- blend (每个相机都会有 模板深度颜色的buffer):
- 将已经渲染到屏幕上的像素和即将渲染到屏幕上的像素做混合,存到gbuffer里
- framebuffer、frontbuffer:
- 将颜色缓存区里面的东西写入framebuffer里
- 交换到显示器上去
Unity3D编程
- Fixed shader:固定管线编程 shader1.0
- Vertex/fragement shader:顶点 片段着色器编程shader2.0
- Surface shader :表面着色器编程 U3D特有
四种光
光照公式:
光照I = 自发光+环境光+漫反射+镜面反射
环境光=环境光颜色 * 环境光向量
漫反射=漫反射光颜色 * 漫反射强度 * (光源向量·法线向量)
镜面反射=镜面光颜色 * 镜面反射强度 * (反射光向量·视角方向)^n
漫反射 (Diffuse)
- 跟观察角无关
- 跟入射角有关
- Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) )
Tip:cosθ = 光方向· 法线方向
镜面反射 (Specular)
- 跟观察角有关
- 跟入射角有关
- Specular=直射光 * pow( max(cosθ,0),10)
θ:是反射光方向和视野方向的夹角
环境光 (Ambient)
周围环境光线
自发光 (Emission)
自己发光
Ambient + Lighting Window’s Ambient Intensity Setting + (Light Color * Diffuse + Light Color * Specular) + Emission
顶点着色器
//路径名
Shader "Custom/TestProperty"
{
//属性:定义属性
Properties
{
//1.数值,滑动条
//2.颜色,向量
//3.贴图
//变量名,显示名,类型, 默认值
_MainTex ("Texture", 2D) = "white" {}
_TestFloat("Test float", float) = 2.5
//GPU 只有浮点数
_TestInt("Test int", int) = 2
//滑动条
_TestRange("TestRange", Range(1,10)) = 5
//颜色
_TestColor("TestColor", Color) = (1,1,1,1)
//向量
//四维向量xyzw,三维矩阵变换,w表示平移
_TestVector("TestVector", Vector) = (1,1,1,1)
//贴图
_TestTexture("TestTexture", 2D) = "white" {}
_TestCube("TestCube", Cube) = "white" {}
_Test3D("Test3D", 3D) = "white" {}
}
//渲染流程:选择对应显卡,只用一个
SubShader
{
//渲染通道:每出现一次就渲染一次
//写代码
Pass
{
//sahder1.0顶点着色器编程(开关式编程):
//Color:表示顶点颜色的定义
// Color (1,0,0,1)
//使用变量
Color[_TestColor]
//Material:定义物体自身材质属性:
//设置物体自身四种光,漫反射,镜面反射,环境光,自发光
material{
}
//sahder1.0开关式编程
SeparateSpecular On
//灯光总开关
lighting On
}
}
//可以适配多个显卡
SubShader
{
Pass
{
}
}
//没找到适配显卡,选择默认shader
Fallback "Diffuse"
}
片段着色器
SetTexture指令
- Previous是上一次SetTexture的结果
- previous指的是先前的数据,将代码改成“combine texture * previous”,这里的意思就是用当前纹理的值去乘上当前settexture操作之前所有计算和采样过后的结果。
- Primary是来自光照计算的颜色或是当它绑定时的顶点颜色
- primary代表了前面所有计算材质和光照后的颜色值,将贴图和这个值相乘,就会得到一个混合的新的颜色值。
- Texture是在SetTexture中被定义的纹理的颜色
- Constant是被ConstantColor定义的颜色
SubShader
{
Pass
{
//设置图片指令
SetTexture[_BlendTex]
{
//代码逻辑
//combine texture
//加减乘 当前贴图颜色
c