简单的逐顶点光照反射shader分析

//游戏开发装逼利器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.有不足或错误谢谢各位大佬解惑。
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值