C++:世界上唯一能让程序员在配置环境上|

香菇0_0

园龄:2年7个月粉丝:10关注:1

【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

本文链接:https://www.cnblogs.com/Xiang-gu/p/16512368.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   香菇0_0  阅读(74)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.