1、什么是OpenGL、DirectX
shader可以认为是一种渲染命令,由openGL或者dx进行解析,来控制渲染丰富多彩的图形
OpenGL 使用GLSL编写shader
DirectX 使用HSSL编写shader
英伟达CG 编写shader(跨平台)
2、unity shader的分类
使用的是ShaderLab编写unity中的shader
1、表面着色器
2、顶点/片元着色器
3、固定管线着色器
3、shader基本结构
shader “Siki/01 myshader”{ // 这里写的是shader的名字,及路径
Properties{ //暴漏在外面进行调整的属性
// 属性
_Color("_Color",Color) = (1,1,1,1) // 颜色
_Vector("Vector",Vector)= (1,2,3,4) // 四维向量
_Int("Int",Int) = 2145 //整数
_Float("Float",Float) = 4.5 //小数
_Range("Range",Range(1,11)) = 6 //区间(例:1到11默认值是6)
_2D("Texture",2D) = "red"{} // 图片贴图(默认红色)
_Cube("Cube",Cube) = "white"{} // 立方体贴图(默认白色)
_3D("Texure",3D) = "black"{} //3D贴图(默认黑色)
}
SubShader{ // 子shader 可以写多个,从第一开始,如果不满足执行下面的shader
Pass{ //至少有一个Pass
// 在这里编写shader代码 HLSLPROGRAM
CGPROGRAM
// 使用CG语言编写shader代码
// 使用属性的时候需要先声明
float4 _Color;
fixed4 _Col; // 一般颜色都使用fixed来存储
float4 _Vector;
float _Int;
float _Float;
float _Range;
sampler2D _2D;
samplerCube _Cube;
sampler3D _3D;
ENDCG
}
}
Fallback “VertexxLit” // 备选方案
}
4、shader的顶点函数与片元函数
unityCG.cginc中一些常用的函数
// 摄影机方向(视角方向)
float3 WorldSpaceViewDir(float4 v) //根据模型空间中的顶点坐标 得到(世界空间)从这个点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) // 世界空间中的顶点坐标 =》 世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) // 模型空间中的顶点坐标 =》 模型空间从这个点到设想相机的观察方向
// 光源方向
float3 WorldSpaceLightDir(float4 v) // 模型空间中的顶点坐标 =》 世界空间中从这个点到光源方向
float3 UnityWorldSpaceLightDir(float v) // 世界空间中的顶点坐标 =》 世界空间中从这个点到光源方向
float ObjSpaceLightDir(float v) // 模型空间中的顶点坐标 =》模型空间中从这个点到光源方向
// 方向转换
float3 UnityObjectToWorldNormal(float3 norm) // 把法线方向 模型空间 =》 世界空间
float3 UnityObjectToWorldDir(float3 dir) //把方向 模型空间 =》 世界空间
float3 UnityWorldToObjectDir(float3 dir) // 把方向 世界空间 =》 模型空间
shader “Siki/01 myshader”{
SubShader{
Pass{
CGPROGRAM
//顶点函数 声明一个名为vert的顶点函数
//基本作用是 完成顶点坐标从模型空间到剪裁空间的转换(从游戏环境转换到视野相机屏幕上)
#progrma vertex vert
// 片元函数 这里只是声明了,片元函数的函数名
// 基本作用 返回模型对应的屏幕上的每一个像素的颜色值
#progrma fragment frag
float4 vert(float4 v : POSITION) :SV_POSITION{ // 通过语义告诉系统,我这个参数是干嘛的,比如POSITION是告诉系统我需要顶点坐标
//SV_POSITION这个语义来解释说明返回值,意思是返回值是剪裁空间下的顶点坐标
float4 pos = mul(UNITY_MATRIX_MVP,v); // 将顶点坐标乘以一个矩阵并返回
return pos;
}
xxx frag(yyy){ // xxx为返回值 yyy为参数
}
ENDCG
}
}
Fallback “VertexxLit” // 备选方案
}