【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法线从本地空间跳转到世界空间的两种方式:
- N = mul(float4(N,0),unity_WorldToObject).xyz;(将法线向量乘以变换矩阵的逆转矩阵)
- N = UnityObjectToWorldNormal(v.normal);(使用Unity自带的方法将法线向量转换到世界空间,之后无需再做单位化)
本文作者:香菇0_0
本文链接:https://www.cnblogs.com/Xiang-gu/p/16512368.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步