坐标空间
- 物体空间:3D物体自己的坐标空间
一般设计时以几何体中心、人物双脚为原点 - 世界空间:3D物体在场景中的世界坐标,整个游戏场景的空间
- 摄像机空间:以观察摄像机为原点的坐标系下的空间
- 投影成像:3D坐标转换到屏幕空间
Unity坐标系转换
- transform.localToWorldMatrix 局部转世界的矩阵
- transform.worldToLocalMatrix 世界坐标转局部坐标矩阵
- shader中左乘_WorldToObject 矩阵实现世界坐标转局部坐标的变换
- shader中左乘_ObjectToWorld矩阵实现局部坐标转世界坐标的变换
- UNITY_MATRIX_MV 基本变换矩阵 x 摄像机矩阵
- UNITY_MATRIX_MVP 基本变换矩阵 x 摄像机矩阵 x 投影矩阵
- UNITY_MATRIX_V 摄像机矩阵
- UNITY_MATRIX_P 投影矩阵
- UNITY_MATRIX_VP 摄像机矩阵 x 投影矩阵
- UNITY_MATRIX_T_MV(基本变换矩阵 x 摄像机矩阵)的转置矩阵
- UNITY_MATRIX_IT_MV(基本变换矩阵 x 摄像机矩阵)的逆转置矩阵
- UNITY_MATRIX_TEXTURE0 纹理变化矩阵
GPU管道流水线
顶点片元着色器
- 控制灵活,但不能参加光照计算
- 在着色器中插入Cg代码段,编写在CGPROGRAM与ENDCG之间
- 编译指令:#program 控制着色器代码编译
#progma vertex name
将名称为name的函数编译为顶点着色器
#pragma fragment name
将名称为name的函数编译为片元着色器 - 参数和返回值有语义修饰
常用语义修饰
- POSITION:位置
- TANGENT:切线
- NORMAL:法线
- TEXCOORD0:第一套纹理
- TEXCOORD1:第二套纹理
- TEXCOORD2:第三套纹理
- TEXCOORD3:第四套纹理
- COLOR:颜色
第一个shader
Shader "Custom/shader00"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Glossiness ("Smoothness", Range(0,1)) = 0.5
_Metallic ("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Pass
{
CGPROGRAM
#pragma vertex my_vert
float4 my_vert(float4 pos : POSITION) : POSITION
{
return UnityObjectToClipPos(pos);
}
#pragma fragment my_frag
fixed4 my_frag() : COLOR
{
return fixed4(1.0, 0.0, 0.0, 1.0);
}
ENDCG
}
}
FallBack "Diffuse"
}