一、光照模型概念
1、什么是光照模型?
光照模型是一种算法/公式,使用这个公式来计算光照效果(光照到每个点上效果)。
2、一些常用的方法:
normalize() 用来把一个向量,单位化(原来方向保持不变,长度变为1)
max() 用来取得函数中最大的一个
dot 用来取得两个向量的点积
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0 取得平行光的颜色
UNITY_LIGHTMODEL_AMBIENT 用来获取环境光
UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间(屏幕空间相机锥形空间)
_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
二、标准光照模型
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分:
- 自发光(self-luminous)
- 漫反射(Diffuse)
- 高光反射(Specular)
- 环境光反射(ambient light)
** 01、漫反射 Diffuse**
- ** Diffuse = 直射光颜色 * cos夹角(光和发现的夹角)(cos夹角的值:1~0) **
- Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) (max取最大值负数的话,取值0)cosθ = 光方向· 法线方向
** 光和法线的夹角夹角计算方式划分:**
- 兰伯特光照模型
- Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向
- 半兰伯特光照模型
- Diffuse = 直射光颜色 *( cosθ *0.5 +0.5 )(1-0之间的变化)
**
**
02、高光反射 Specular
** 根据夹角不同划分:**
**Blinn光照模型 **
- Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和视野方向的夹角
Blinn-Phong光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是法线和x的夹角。 x 是平行光和视野方向的平分线。
**03、环境光反射 **ambient light
Tags{ “LightMode”=”ForwardBase” }
只有定义了正确的LightMode才能得到一些Unity的内置光照变量
#include “Lighting.cginc”
包含unity的内置的文件,才可以使用unity内置的一些变量
三、UnityCG.cginc中一些常用的函数
摄像机方向(视角方向)
- float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
- float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
- float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
光源方向
- float3 WorldSpaceLightDir(float4 v) 模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
- float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
- float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
方向转换
- float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
- float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间
- float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间
四、漫反射和高光反射的统一实现(复习)
1 | Shader "LJK/10_testDiffuseSpecularShader" |
五、关于纹理贴图介绍
纹理坐标(UV坐标)
“UV”这里是指u,v纹理贴图坐标的简称(它和空间模型的X, Y, Z轴是类似的). 它定义了图片上每个点的位置的信息. 这些点与3D模型是相互联系的, 以决定表面纹理贴图的位置.
UV就是将图像上每一个点精确对应到模型物体的表面. 在点与点之间的间隙位置由软件进行图像光滑插值处理. 这就是所谓的UV贴图.
** 为什么用UV坐标而不是标准的投影坐标呢?**
通常给物体纹理贴图最标准的方法就是以planar(平面),cylindrical(圆柱), spherical(球形),cubic(方盒)坐标方式投影贴图. Planar projection(平面投影方式)是将图像沿x,y或z轴直接投影到物体. 这种方法使用于纸张, 布告, 书的封面等 - 也就是表面平整的物体.
平面投影的缺点是如果表面不平整, 或者物体边缘弯曲, 就会产生如图A的不理想接缝和变形.
避免这种情况需要创建带有alpha通道的图像, 来掩盖临近的平面投影接缝, 而这会是非常烦琐的工作. 所以不要对有较大厚度的物体和不平整的表面运用平面投影方式. 对于立方体可以在x, y方向分别进行平面投影, 但是要注意边缘接缝的融合. 或者采用无缝连续的纹理, 并使用cubic投影方式. 多数软件有图片自动缩放功能, 使图像与表面吻合. 显然, 如果你的图像与表面形状不同, 自动缩放就会改变图像的比例以吻合表面. 这通常会产生不理想的效果, 所以制作贴图前先测量你的物体尺寸.
** 使用纹理目的:**
利用纹理颜色代替漫反射颜色。
- Tiling重复属性(瓷砖平铺)
- Offset偏移量
** shader中的各种空间坐标**
http://blog.csdn.net/lyh916/article/details/50906272
常用的Shader收集/整理
关于凹凸映射和法线映射的介绍
HeightMap
NormalMap
Occlusion
Emission
DetailMask
01、使用法线映射和没有使用的对比
法线映射
pixel = (normal+1)/2 normal与pixel的转换关系
normal = pixel*2 - 1
02、什么是切线空间?
http://blog.csdn.net/bonchoix/article/details/8619624
1 | Shader "LJK/14_testRockAlphaShader" |
- 本文作者: 梁俊可
- 本文链接: http://ljk3d.com/2021/10/19/unityNote/UnityBasic/Shader着色器开发——02光照模型/
- 版权声明: 梁俊可工作室