//游戏开发装逼利器Shader 框架
Shader "Custom/MyDiffuseVertex" {
SubShader {
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f{
float4 Pos:SV_POSITION;
fixed3 color:COLOR;
};
v2f vert(a2v v)
{
v2f o;
o.Pos=mul(UNITY_MATRIX_MVP,v.vertex);
fixed3 normaldir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
fixed3 lightdir=normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse =_LightColor0.rgb*(saturate(dot(normaldir,lightdir)));
o.color=diffuse;
return o;
}
float4 frag(v2f f):SV_Target
{
return fixed4(f.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
/*
编写时犯得错误和心得
1. 结构体 struct "name"{}; 后必须加分号;属性定义里可以不加分号;
2. 语义定义;结构体可以用来传递运算后的数据
3. 本篇shader的核心运算为 物体顶点光照=光照射方向 点积 物体顶点法线向量
点积的集合意义 向量a 点积 向量b 等于 向量a的长度 乘以 向量b的长度 再乘以 cos两向量的夹角;由于运算时 顶点的法线向量先归一化
光照方向归一化;所以结果就是 cos两向量的夹角; 当夹角为0时为1 物体顶点的像素为光照的rgb乘以1;箱夹角大于等于90度 或小于等于0度时
即 90<= x <=270 此时显示的用max 或 saturate返回的都是0;也就是黑色; 顶点与顶点之间的区域GPU会以插值的算法填充;
4.通常申请fixed3或fixed4 表示颜色;float4 表示模型顶点。
通常在结构体 a2v中得到模型信息 比如顶点 法线 ;在v2f即储存裁剪空间中的信息 比如 SV_POSITION Color
片元函数SV_Target 颜色值,显示到屏幕上的颜色。
5.有不足或错误谢谢各位大佬解惑。
*/
Shader "Custom/MyDiffuseVertex" {
SubShader {
Pass{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "Lighting.cginc"
struct a2v{
float4 vertex:POSITION;
float3 normal:NORMAL;
};
struct v2f{
float4 Pos:SV_POSITION;
fixed3 color:COLOR;
};
v2f vert(a2v v)
{
v2f o;
o.Pos=mul(UNITY_MATRIX_MVP,v.vertex);
fixed3 normaldir=normalize(mul(v.normal,(float3x3)unity_WorldToObject));
fixed3 lightdir=normalize(_WorldSpaceLightPos0.xyz);
fixed3 diffuse =_LightColor0.rgb*(saturate(dot(normaldir,lightdir)));
o.color=diffuse;
return o;
}
float4 frag(v2f f):SV_Target
{
return fixed4(f.color,1);
}
ENDCG
}
}
FallBack "Diffuse"
}
/*
编写时犯得错误和心得
1. 结构体 struct "name"{}; 后必须加分号;属性定义里可以不加分号;
2. 语义定义;结构体可以用来传递运算后的数据
3. 本篇shader的核心运算为 物体顶点光照=光照射方向 点积 物体顶点法线向量
点积的集合意义 向量a 点积 向量b 等于 向量a的长度 乘以 向量b的长度 再乘以 cos两向量的夹角;由于运算时 顶点的法线向量先归一化
光照方向归一化;所以结果就是 cos两向量的夹角; 当夹角为0时为1 物体顶点的像素为光照的rgb乘以1;箱夹角大于等于90度 或小于等于0度时
即 90<= x <=270 此时显示的用max 或 saturate返回的都是0;也就是黑色; 顶点与顶点之间的区域GPU会以插值的算法填充;
4.通常申请fixed3或fixed4 表示颜色;float4 表示模型顶点。
通常在结构体 a2v中得到模型信息 比如顶点 法线 ;在v2f即储存裁剪空间中的信息 比如 SV_POSITION Color
片元函数SV_Target 颜色值,显示到屏幕上的颜色。
5.有不足或错误谢谢各位大佬解惑。
*/