Unity/Shader 零碎知识点

来源:shader入门精要-冯乐乐

坐标系
Unity使用的是左手坐标系;观察空间,通俗来讲就是以摄像机为原点的坐标系,摄像机的前向是z轴的负方向,与模型和世界空间中的定义相反,z轴的坐标减少意味着场景深度的增加
在这里插入图片描述

点积
a·b=b·a=|a||b|cos<a,b> 结果为常量,几何意义:投影

在这里插入图片描述

叉积
常见应用:计算垂直于一个平面、三角形的矢量。另外,还可以用于判断三角面片的朝向
在这里插入图片描述

齐次坐标(四维矢量)
在计算机图形学里面会经常碰到几何体的平移,旋转,缩放以及投影变换. 一般情况下会涉及到齐次坐标与变换矩阵
顶点着色器最基本的功能就是把模型的顶点坐标从模型空间转换到齐次裁剪坐标空间中

坐标空间的变换
在这里插入图片描述
观察空间和屏幕空间是不同的,观察空间是一个三维空间,而屏幕空间是一个二维空间。从观察空间到屏幕空间的转换需要经过一个操作,那就是投影
变换顺序:缩放》旋转》平移
将顶点坐标系从世界空间变换到观察空间中,这个变换通常叫做观察变换

在DirectX里面,NDC的z方向取值范围是[0,1],openGL环境下是[-1,1],
标准化设备坐标(NDC)是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。
在这里插入图片描述
在这里插入图片描述

unity内置lightmap的调用(内置光照贴图)

参照:UnityShader实例07:在shader调用unity内置lightmap和light Probes
//使能支持unity内置lightmap或者light probe (灯光探测器)
#pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON

在unity5.0之前的版本需要声明一下两个内置参数,unity5.0的话就不需要这两句了:
half4 unity_LightmapST;
sampler2D unity_Lightmap;

Lightmap是使用模型的uv2 ,因此接下来在顶点输入结构体里声明uv2:
float2 texcoord1 : TEXCOORD1;

在vert函数里面给uvLM赋值:
#ifndef LIGHTMAP_OFF
o.uvLM = v.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
#endif

然后frag函数里对lightmap贴图采样并叠加给主颜色:
#ifndef LIGHTMAP_OFF
fixed3 lm = DecodeLightmap (UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uvLM.xy));
col.rgb*=lm;
#endif