shader 常用函数

因为unity shader的函数API不好找,碰到一个我就记录下来,下次好查。

1.坐标相关
float3 UnityObjectToWorldNormal(float3 normal):把法线方向从模型空间转换到世界空间

float3 UnityObjectToWorldDir(float3 dir) :把方向矢量从模型空间转换到世界空间

float3 UnityWorldSpaceViewDir(float4 v):输入一个世界空间的顶点坐标,返回世界空间的从该点到摄像机的观察方向

LinearEyeDepth:负责把深度纹理的采样结果转换到世界空间下的深度值,即Z'zisw
Linear01Depth:返回一个范围[0,1]的线性深度值,即 Z(01)
_ZBufferParams:得到远近裁剪平面的距离
_CameraDepthNormalsTexture:获取需要的深度+法线纹理

2.图片相关
1)float2 TRANSFORM_TEX(v.texcoord, _MainTex):作用是拿顶点的uv去和材质球的tiling和offset作运算, 确保材质球里的缩放和偏移设置是正确的,最后计算出实际显示用的定点uv
offset:指明使用贴图的起始位置,取值范围为0-1
tiling:指明从offset位置处的大小区域,区域的取值范围一般为(-1,1),超过的话部分会按比例生成新的区域拼接上原先的。

2)float4 Tex2D(sampler2D tex, float2 s) :s-需进行查找的纹理坐标,返回二维纹理, s通常是TRANSFORM_TEX的结果值。

3)UnpackNormal(float4):接受一个fixed4的输入,并将其转换为所对应的法线值(fixed3)

4)texCUBE(sampler2D tex, float3 texture coordinate) :对Cubemap采样,第二个参数应该传入UV坐标,但实际传入的是世界反射向量。这是Unity替我们计算了UV坐标。

5)ComputeGrabScreenPos(o.pos) 得到对应被抓取的屏幕图像的采样坐标

6)Cs -》 Graphics.Blit(src, dest, material); src纹理将会被传递到shader中名为_MainTex的纹理属性。

6) float DecodeFloatRGBA (float4 enc):解码RGBA颜色到float

3.光照相关
reflect(I, N): 获取反射方向,I 入射光方向,N法线


4.数学相关:
1)floor  返回小于等于x的最大整数

2)frac 返回分数部分

3) lerp(a,b,f):线性插值函数,返回值为(1-f)*a+b*f

4)Clamp(x,a,a):如果x<a返回a;如果x>b返回b;如果在a和b之间就返回x

5)Step(a,x ) Returns (x >= a) ? 1 : 0

6)   smoothstep(edge0, edge1, x): threshod  smooth transition时使用。 edge0<=x时为0.0, x>=edge1时为1.0,可以在[edge0,edge1]区间内,得到从0到1光滑变化的spec值。

7) fwidth(x):返回 abs(ddx(x)) + abs(ddy(x)),返回指定值的偏导数的绝对值。
ddx :返回关于屏幕坐标x轴的偏导数
ddy:返回关于屏幕坐标y轴的偏导数

5.宏相关
1)UNITY_UV_STARTS_AT_TOP 总是用1或0定义;当纹理的V坐标系原点在纹理顶部的平台上值是1。Direct3D类似平台使用1;OpenGL类似平台使用0。
在Direct3D平台下,如果我们开启了抗锯齿,则xxx_TexelSize.y 会变成负值,好让我们能够正确的进行采样。
所以if(_MainTex_TexelSize.y < 0)的作用就是判断我们当前是否开启了抗锯齿。
所以 #if UNITY_UV_STARTS_AT_TOP 可以用来判断我们是否是在 Direct3D 平台下。


6.矩阵:
UNITY_MATRIX_MVP        
将顶点/方向向量从模型空间变换到裁剪空间
UNITY_MATRIX_MV
将顶点/方向向量从模型空间变换到 视图 空间
UNITY_MATRIX_V    
将顶点/方向向量从模型空间变换到视图空间( model物体空间->view视空间转换矩阵 )
UNITY_MATRIX_P             
将顶点/方向向量从 视图 空间变换到裁剪空间( model物体空间 -> projection投影空间转换矩阵)
UNITY_MATRIX_VP           
将顶点/方向向量从视图空间变换到裁剪空间 ( view视空间 -> projection投影空间转换矩阵 )

UNITY_MATRIX_T_MV      UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV    
UNITY_MATRIX_MV的转置逆矩阵 (model物体空间 ->view视空间矩阵的逆转置矩阵)

UNITY_MATRIX_TEXTURE0   UNITY_MATRIX_TEXTURE3    纹理变换矩阵

_Object2World:Current model matrix 当前物体矩阵
eg: o.worldPos = mul(_Object2World, v.vertex).xyz; 从模型空间转换为世界空间

_World2Object:Inverse of current world matrix物体矩阵的逆矩阵 世界空间转物体空间
eg:o.worldNormal = mul(v.normal, (float3x3)_World2Object); 法线从模型空间转换为世界空间

_WorldSpaceCameraPos:World space position of the camera世界坐标空间中的摄像机位置
unity_Scale:xyz components unused; .w contains scale for uniformly scaled objects.不适用xyz分量,而是通过w分量包含的缩放值等比缩放物体。

Model:模型空间
View:视图空间
World:世界空间
Projection:裁剪空间
流程: Model->World->View->Projection Space

猜你喜欢

转载自blog.csdn.net/xj1009420846/article/details/80313542