【Unity Shader学习】Shader学习笔记01

1.Fixed function shader:属于固定渲染管线Shader,用于高级Shader在老显卡无法显示时的情况下,使用的是ShaderLab语言。

2.Shader包含的文件在Unity中后缀为.cginc。(放在CgIncludes文件夹下)

3.PassDef有三种形态:固定管线、可编程Shader、SufaceShader

4.CG语言与HLSL语言大体上一致,通常使用CG+OpenGL或HLSL+D3D。

5.Lambert光照模型:包含环境光和漫反射光,是一种经验模型,用于纸张、粗糙墙壁等物体。

当该顶点的法向量和指向光源的向量点乘结果小于0时该顶点不接受光照。

环境光公式:I_ambi=K_d * I _a 

漫反射公式:I_diff=K_d * I_I * (N·L)

6.Phong光照模型:包含环境光、漫反射及高光,用于金属这样的光滑表面。

高光公式:I_spec = k_z * I_I(V·R)^n_s

BlinnPhong模型求镜面反射的方法是:由指向光源的向量L和指向摄像机的向量V求和得到一个半角向量H,然后求法线N与半角向量H的点积,值越大表示镜面反射高光越强。(避免了求反射向量R的过程,直接通过N,H的点积求得镜面反射高光值)

7.为什么使用FallBack:当SubShader无法在当前显卡运行时,可以回滚到一个Unity内置的通用Pass。

8.在顶点处理时必须对顶点进行合适的MVP变换,否则将看不到几何模型的正确显示。

9.光照计算点乘结果如果为负值是没有意义的,可以通过Saturate函数将值限定在0-1之间。

例如:float ndotl = saturate(dot(N,L));     o.color = _LightColor0 * ndotl;

10.为了防止点乘结果不准确,在点乘之前应该将向量进行归一化。

例如:float3 N = normalize(v.normal); float3 L = normalize(_WorldSpaceLightPos0);

11.光照计算应当在同一坐标空间下进行。

12.使用swizzle方法可以自由获取向量的各个分量:

例如:float4(1,2,3,4).xyz的值为float3(1,2,3)

13.通过使用passTag可以设置当前光照模式。

例如:

tags{"LightMode" = "ForwardBase"}(支持环境光、直接光、点光源)

tags{"LightMode" = "Vertex"}(只显示点光源)

14.直接将物体法线向量转换到世界坐标系下去计算是错误的,应当将法线向量乘以转逆矩阵。

例如:

N = mul(float4(N,0),_World2Object).xyz;(CG语言中将变换矩阵写在mul函数的第二个参数的位置时表示向量乘以当前变换矩阵的转置)

15.要实现平滑的光照效果可以将光照计算放在片元函数中(顶点程序计算光照执行效率高,片元程序计算光照较慢但更为细腻平滑)

16.Unity法线从本地空间跳转到世界空间的两种方式:

  1. N = mul(float4(N,0),unity_WorldToObject).xyz;(将法线向量乘以变换矩阵的逆转矩阵)
  2. N = UnityObjectToWorldNormal(v.normal);(使用Unity自带的方法将法线向量转换到世界空间,之后无需再做单位化)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值