Unity-Shader编写基础及注意事项(二)

Unity-Shader编写基础及注意事项(二)

  1. 座标系规则:Unity中存在空间座标系模型座标系相机座标系以及屏幕座标系。注意:空间座标系和模型座标系均是左手座标系,+z在物体的正前方,相机座标系是右手座标系,+z指向相机后方。
  2. 座标系变换:包含平移、旋转和缩放变换。注意:三维座标的平移不能用3X3矩阵表示,所以扩展到4X4的齐次座标。Unity-Shader中大多数用到4X4齐次矩阵变换,如下公式为座标变换原理。
  1. 点积(内积)与叉乘(外积):记住一句顺口溜就好,点积计算角度,叉乘判断方位。比如:你要判断敌人在你什么方位,通过点积可以计算敌人与你的夹角度数,但不知道敌人在你的左边还是右边,这个时候叉乘便可以计算你与敌人的方位。

  2. Unity中的Shader一般包括四种:
    (1)Standard Surface Shader:包含标准光照模型,基于物理渲染的标准表面着色器,这个可以使用于大多数的模型渲染,除非需要添加其他特效才需要自己编写,否则一般unity自带的shader就够用了。
    (2)Unlit Shader:不包含光照模型,包含雾效的顶点/片元着色器。
    (3)Image Effect Shader:为实现各种屏幕后效提供了一个模板。
    (4)Compute Shader:不参与渲染流程,这可以说是CPU利用GPU并行高效计算的接口。

  3. unity中所谓的表面着色器实质上是顶点/片元着色器的更加高级抽象的表示而已。

  4. 顶点/片元着色器的基本结构如下:

//每个Shader都有一个专属 名字,冒号里面的便是Unity面板显示的shader名字
Shader "MyShader"{
//shader中计算或是传递所需要的属性,在Unity面板中可以显示所需要的属性,如贴图,颜色等
Properties{
}
//针对显卡A的Shader
SubShader{
//及其重要的部分,一个pass代表一次2渲染,基本上大部分代码都写在Pass块中
Pass{
   	//先设置渲染状态和标签
   	//这里开始CG代码的编写
   	CGPROGRAM
   	//声明顶点/片元着色器函数名分别为vert和frag
   	#pragma vertex vert
   	#pragma fragment frag
   	//顶点着色器函数
   	//POSITION以及SV-POSITION为CG/HLSL中的语义,该语义不可忽略,他告诉函数需要哪些输入和输出,其中POSITION告诉vert函数的输入v,将模型顶点座标填入v中;SV-POSITION告诉函数输出返回值为裁剪空间的顶点座标。
   	float4 vert(float4 v:POSITION:SV_POSITION
   	{
   		return mul(UNITY_MATRIX_MVP,v);
   	}
   	//片元着色器函数
   	float4 frag():SV_Target
   	{
   		return fixed4(1.0,1.0,1.0,1.0);
   	}
   	//这里结束CG代码的编写
   	ENDCG
   	}
}
//针对显卡B的Shader
SubShader{

}
//上述SubShader都失败时调用低级的渲染Shader
Fallback “VertexLit”
}
  • ShaderLab属性类型和CG变量类型关系:
ShaderLab属性类型 CG变量类型
Color,Vector float4,half4,fixed4
Range,Float float,half,fixed
2D sampler2D
3D sampler3D
  • 内置包含文件,类似于C++中头文件的引用:
CGPROGRAM
......
#include "UnityCG.cginc"
......
ENDCG
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章