最简shader模板
Shader "AP1/L03/FlatCol" {
Properties {
//材质面板
}
SubShader {
Tags {
"RenderType"="Opaque"
}
Pass {
Name "FORWARD"
Tags {
"LightMode"="ForwardBase" //Pass标签
}
CGPROGRAM //包围CG代码
#pragma vertex vert //定义顶点和片元着色器
#pragma fragment frag
#include "UnityCG.cginc"
#pragma multi_compile_fwdbase_fullshadows
#pragma target 3.0
// 输入结构
struct VertexInput {
float4 vertex : POSITION; // 将模型的顶点信息输入进来
};
// 输出结构
struct VertexOutput {
float4 pos : SV_POSITION; // 由模型顶点信息换算而来的顶点屏幕位置
};
// 输入结构>>>顶点Shader>>>输出结构
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0; // 新建一个输出结构
o.pos = UnityObjectToClipPos( v.vertex ); //变换顶点信息并将其塞给输出结构
return o; // 将输出结构 输出
}
// 输出结构>>>像素
float4 frag(VertexOutput i) : COLOR {
return float4(0.0, 1.0, 0.0, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}
各种向量
- nDir:normal 法线方向,点乘操作时简称n;
- lDir: light 光照方向,点乘操作时简称l;
- vDir:view 观察方向,点乘操作时简称v;
- rDir:reflect 光反射方向,点乘操作时简称r;
- hDir:half 半角方向(即lDir和vDir的中间角方向),点乘操作时简称h;
- OS:ObjectSpace 物体空间,本地空间
- WS:WorldSpace 世界空间;
- VS: ViewSpace 观察空间;
- CS:HomogenousClipSpace 齐次剪裁空间;
- TS:TangentSpace 切线空间;
- TXS:TextureSpace 纹理空间;
光照构成
光照模型
一、Lambert 和 Half Lambert 漫反射光照模型
- Lambert:
float4 frag(VertexOutput i) : COLOR
{
float3 nDir = i.nDirWS;
float3 lDir = _WorldSpaceLightPos0.xyz;
float nDotl = dot(nDir,lDir); //
float lambert = max(0.0,nDotl);
return float4(lambert,lambert,lambert,1.0);
}
- Half Lambert:
float lambert = nDotl*0.5+0.5;
![](https://img-blog.csdnimg.cn/6eecfcb1113e4bd5a024dce06d0036d9.png)
![](https://img-blog.csdnimg.cn/8bc9c4b4fd744cbda6715fea9fa1f008.png)
![](https://img-blog.csdnimg.cn/546532140c814815b32e7be8332dfa9a.png)
- 作业:
思路: 以半兰伯特模型构造uv坐标采样Ramptex(Ramptex贴图:1. 3阶明度,过渡卡硬 2.暗部色相变化,少明度变化)
- 点评案例:
1. 玉石效果
2. 像素点效果
3. SSSLut效果
二、Phong/Blinn-Phong高光模型
- Phong:
float3 rDir = reflect(-lDir,nDir);
float rDotv = dot(rDir,vDir);
float phong = pow(max(0.0,rDotv),_SpecularPow);
float3 finaRGB = _MainCol * lambert + phong;
- Blinn-Phong:
float3 hDir = normalize( vDir + lDir );
float nDoth = dot(nDir,hDir);
float blinnphong = pow(max(0.0,nDoth),_SpecularPow);
![](https://img-blog.csdnimg.cn/a7e71369a92f43d7a2add512647129cb.png)
![](https://img-blog.csdnimg.cn/d550a1743f3941b6903a625a64cfb6a0.png)
三、OldSchoolPlus
- Lambert + Phong + Shadow + 3ColAmbient + AO (忽略镜面反射cubemap)
shader forge:
代码:
Shader "Unlit/13_OldSchoolPlus"
{
Properties
{
_BaseCol ("BaseCol",color) = (1.0, 1.0, 1.0, 1.0)
_SpecularPow ("SpecularPow", range(1,90)) = 30
_LightCol ("LightCol",color) = (1.0, 1.0, 1.0, 1.0)
_Occlusion ("Occlusion", 2D) = "white" {}
_EnvUpCol ("EnvUpCol",color) = (1.0, 1.0, 1.0, 1.0)
_EnvSideCol ("EnvSideCol",color) = (1.0, 1.0, 1.0, 1.0)
_EnvDownCol ("EnvDownCol",color) = (1.0, 1.0, 1.0, 1.0)
_EnvColPow ("EnvColPow", range(0,1)) = 0.2
}
SubShader
{
Tags { "LightMode"="ForwardBase" }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// make fog work
#pragma multi_compile_fog
#include "AutoLight.cginc"//投影头文件
#include "Lighting.cginc"
#include "UnityCG.cginc"
//输入参数
uniform float3 _BaseCol;
uniform float _SpecularPow;
uniform float _EnvColPow;
uniform float3 _LightCol;
uniform float3 _EnvUpCol;
uniform float3 _EnvSideCol;
uniform float3 _EnvDownCol;
uniform sampler2D _Occlusion;
//输入结构
struct VertexInput{
float4 vertex : POSITION;
float4 normal : NORMAL;
float2 texcoord0: TEXCOORD0; //将模型uv信息输入进0通道
};
//输出结构
struct VertexOutput{
float4 pos : SV_POSITION;
float2 uv0 : TEXCOORD0;
float4 posWorld : TEXCOORD1;
float3 normalDir : TEXCOORD2;//追加uv信息用于像素shader采样贴图
LIGHTING_COORDS(3,4)//投影