坐标 ——位置
向量 ——长度、方向
坐标 ——位置
向量 ——长度、方向
use pass通道名称时,名称必须全大写。
tags可以写再所有pass的前面对之后的所有pass定义,也可以写在pass内,对单独的pass定义。
里外都定义时,走的时外面。
Render设置同理。
用shader做顶点变换时不可以做合批,会出问题。
所以unity的批处理依赖的GPU的是CPU而不是GPU。
顶点数不等于片元数,一般片元数大于顶点数
纹理坐标(UV)
三角形遍历=扫描变换
模型空间 => 齐次裁剪空间 =>顶点色
| |
物体顶点坐标 =>长宽高为1的世界坐标空间内=>顶点色(平面2维坐标系)
减少Draw Call 的方法
1静态合批
2动态合批
3GPU instaning
1,Occlusion Culling遮挡剔除,基于摄像机(CPU处理)
2,shader信息(CPU处理)
3.可读可写的渲染数据会同时占用内存和显存?
语义 |
描述 |
SV_POSITION |
裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量。等同于DX9中的POSITION。 |
COLOR0 |
通常用于输出第一组顶点颜色,不是必须 |
COLOR1 |
通常用于输出第二组顶点颜色,不是必须 |
TEXCOORD0-TEXCOORD7 |
通常用于输出纹理坐标,不是必须 |
1 纹理类型设置成normal map unity会自动转换像素 0-1 到 -1到1
2 UnpackNoraml 解压 法线贴图 直接使用
_Int("int",Int)
摄像机:
近平面:超出近平面范围将被舍弃
远平面:超出远平面范围将被舍弃
FOV:视椎体角度
uniform vec2 _res;
uniform vec3 _move;
out vec4 fragColor;
void main()
{
vec3 uv = vec3(gl_FragCoord.xy/_res,1);//映射坐标为0~1
mat3 M = mat3(1,0,_move.x, //x=-0.5
0,1,_move.y,
0,0,1);//平移矩阵
uv = uv * M;//相乘 OpenGL为列向量
vec4 color = texture(sTD2DInputs[0], uv.xy);
fragColor = TDOutputSwizzle(color);
}
模型空间→世界空间→相机空间→屏幕空间
世界空间顶点=模型空间顶点*世界矩阵
相机空间顶点=模型空间顶点*世界矩阵*相机矩阵
uniform vec2 _shear;
uniform vec2 _res;
out vec4 fragColor;
void main()
{
vec2 uv = gl_FragCoord.xy/_res;//将坐标系改为0~1
mat2 shaer = mat2(1,_shear.x,
_shear.y,1); //二维切变矩阵 此时_shear.x=-0.2 _shear.y=0
uv *= shaer; //坐标与矩阵相乘
vec4 outcol = texture(sTD2DInputs[0], uv);
vec4 color = outcol;
fragColor = TDOutputSwizzle(color);
}
正常
XY:
2D缩放矩阵[kx,0
0,ky]
3D缩放矩阵[kx,0,0
0,ky,0
0,0,kz]
和差公式
sin(a+b) = sin(a)*cos(b)+cos(a)*sin(b)
sin(a-b) = sin(a)*cos(b)-cos(a)*sin(b)
cos(a+b) = cos(a)*cos(b)-sin(a)*sin(b)
cos(a-b) = cos(a)*cos(b)+sin(a)*sin(b)
旋转矩阵
点P.X=角度*cos*P的模长
点P.Y=角度*sin*P的模长
P角度=a
P1和P的夹角=b
即
P.X=r*cos(a)
P.Y=r*sin(a)
r=1
则P1的X点 = r*Cos(a+b)
根据和差公式得 = r*Cos(a)*Cos(b)-r*Sin(a)*Sin(b)
化简后得 = P.X*Cos(b)-P.Y*Sin(b)
P1的Y点 = r*Sin(a+b)
根据和差公式得 = r*Sin(a)*Cos(b)+r*Cos(a)*Sin(b)
化简后得 = P.Y*Cos(b)+P.X*Sin(b)
整理得
P1.X = P.X*Cos(b)-P.Y*Sin(b)
P1.Y = P.X*Sin(b)+P.Y*Cos(b)
矩阵写法
[x1,y1]=[cos(b),-sin(b),sin(b),cos(b)]*[x,y]