Shader

阅读: 评论:0

Shader

Shader

常用文件:
文件路径:{Unity安装路径}/Editor/Data/CGIncludes/
参考资料:.html
参考资料:《Unity Shader 入门精要》

文件名描述
inc最常使用的帮助函数、宏和结构体等
inc编译Shader时会自动包含,文件包含了许多内置的全局变量
Lighting,cginc包含各种内置光照模型,如果编写的surface shader 会自动包含
inc编译Shader时会自动包含,声明了很多跨平台的编译宏和定义

常用方法、宏、变量:

方法描述
UnityObjectToClipPos文件: inc
格式:
float3 UnityObjectToClipPos(in float3 pos)
float3 UnityObjectToClipPos(float4 pos)
描述:局部坐标转换位齐次坐标
UnityObjectToViewPosinc
UnityObjectToWorldDir文件&#inc
格式:float3 UnityObjectToWorldDir(in float3 dir)
描述:把方向矢量从模型空间转换到世界空间中
UnityObjectToWorldNormal文件&#inc
格式:float3 UnityObjectToWorldNormal(in float3 norm)
描述:将模型空间下的法线转为世界空间下的法线
UnityWorldToClipPosinc
UnityWorldToViewPosinc
UnityWorldToObjectDir文件&#inc
格式:float3 UnityWorldToObjectDir(float3 dir)
描述:把方向矢量从世界空间变换到模型空间中
UnityWorldSpaceLightDirinc
WorldSpaceLightDir文件&#inc
格式:float3 WorldSpaceLightDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染)
ObjSpaceLightDir文件&#inc
格式:float3 ObjSpaceLightDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向(没有归一化,仅可用于向前渲染)
UnityWorldSpaceViewDirinc
WorldSpaceViewDir文件&#inc
格式:float3 WorldSpaceViewDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
ObjSpaceViewDir文件&#inc
格式:float3 ObjSpaceViewDir(float4 v)
描述:输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
UnityViewToClipPosinc
ComputeScreenPos文件: inc
格式: float4 ComputeScreenPos(float4 pos)
描述:输入一个齐次坐标空间的值计算屏幕坐标值
ComputeGrabScreenPos文件&#inc
格式:float4 ComputeGrabScreenPos(float4 pos)
描述:输入齐次坐标空间的值获取抓取屏幕纹理的坐标值 ,内部主要做两件事:1.处理DX和OpenGL纹理坐标差异 2.将标准裁剪空间(-1,1)区间的顶点转化到(0,1)区间
LinearEyeDepth文件&#inc
格式:float LinearEyeDepth(float z)
描述:把深度纹理的采样结果转换到视角空间下的深度值
Linear01Depth文件&#inc
格式:float Linear01Depth(float z)
描述:返回一个范围在[0, 1]的线性深度值
UnpackNormal文件&#inc
格式:fixed3 UnpackNormal(fixed4 packednormal)
描述:获取法线纹理的正确采样
描述
TRANSFORM_TEX文件&#inc
格式:TRANSFORM_TEX(tex,name)
描述:将模型顶点的uv和Tiling、Offset两个变量进行运算,计算出实际显示用的定点uv。如果Tiling 和Offset是默认值(即Tiling为(1,1) Offset为(0,0))可以直接使用o.uv = ,也能正常显示
COMPUTE_EYEDEPTH文件: inc
格式:COMPUTE_EYEDEPTH(o)
描述:计算顶点在视觉空间的深度,并输出到o中(如果不渲染深度纹理时,请在顶点着色器中使用)
SAMPLE_DEPTH_TEXTURE_PROJ文件&#inc
格式:SAMPLE_DEPTH_TEXTURE_PROJ(tex,uv)
描述:深度纹理进行采样,tex:深度纹理,uv:float3或float4纹理坐标,通常为由顶点着色器输出插值而得的屏幕坐标。
例如:
SMAPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.srcPos))
i.srcPos 是在顶点着色器中通过调用ComputeScreenPos(o.pos)得到的屏幕坐标
UNITY_PROJ_COORD文件&#inc
格式:UNITY_PROJ_COORD(a)
描述:输入一个四维向量,返回一个适合投影纹理读取的纹理坐标。大多数平台上,这直接返回给定值。
TANGENT_SPACE_ROTATION文件&#inc
格式:
#define TANGENT_SPACE_ROTATION
float3 binormal = cross( v.normal, ) * v.tangent.w;
float3x3 rotation = float3x3( , binormal, v.normal )
描述:构造出tangent space的坐标系,定义转换到tangent(在实际使用中,相当于嵌入上两行代码)
变量
_WorldSpaceCameraPos文件:UnityCG.glslinc
定义: uniform vec3 _WorldSpaceCameraPos
描述:当前渲染相机在世界空间下的位置
_LightSpaceLightPos0文件:UnityCG.glslinc
定义:uniform vec4 _WorldSpaceLightPos0
描述:
_Time文件:UntiyCG.glslinc
定义:uniform vec4 _Time
描述:t是自场景加载开始所经过的时间。4个分量分别为:(t/20,t,t2,t3)
_SinTime文件:UntiyCG.glslinc
定义:uniform vec4 _SinTime
描述:t是时间的正弦值,4个分量分别是(t/8,t/4,t/2,t)
_CosTime文件:UntiyCG.glslinc
定义:uniform vec4 _CosTime
描述:t是时间的余弦值,4个分量分别是(t/8,/4,t/2,t)
_ProjectionParams文件:UntiyCG.glslinc
定义:uniform vec4 _ProjectionParams
描述:x=1.0(或-1.0),y=Near,z = Far,w=1.0+1.0/Far,Near和Far分别为近裁剪平面和远裁剪平面和相机的距离
_ScreenParams文件:UntiyCG.glslinc
定义:uniform vec4 _ScreenParams
描述:x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度
_LightPositonRange文件:UntiyCG.glslinc
定义:uniform vec4 _LightPositonRange
描述:
unity_ObjectToWorld文件:GLSLSupport.glslinc
定义:uniform mat4 unity_ObjectToWorld
描述:
unity_WorldToObject文件:GLSLSupport.glslinc
定义:uniform mat4 unity_WorldToObject
描述:
unity_MatrixVP文件:GLSLSupport.glslinc
定义:uniform mat4 unity_MatrixVP
描述:>
unity_MatrixV文件:GLSLSupport.glslinc
定义:uniform mat4 unity_MatrixV
描述:
unity_MatrixIntV文件:GLSLSupport.glslinc
定义:uniform mat4 unity_MatrixIntV
描述:

Unity内置的变换矩阵

变量名描述
UNITY_MATRIX_MVP模型·观察·投影矩阵,用于将顶点/方向矢量从模型空间下变换到裁剪空间
UNITY_MATRIX_MV模型·观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间
UNITY_MATRIX_V观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间
UNITY_MATRIX_P投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间
UNITY_MATRIX_VP观察·投影矩阵,用于将顶点、方向矢量从世界空间变换到裁剪空间
UNITY_MATRIX_T_MVUNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MVUNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵
_Object2World模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
_World2Object_Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间

Blend混合

指令描述
Blend Off关闭混合
Blend SrcFactor DstFactorSrcFactor和DstFactor都为混合因子(系数),S是源颜色,D是目的颜色。
公式:
Colorrgb = SrcFactor *Srgb + DstFactor * Drgb
Colora = SrcFactor * Sa + DstFactor * Da
Blend SrcFactor DstFactor,SrcFactorA DstFactorASrcFactor和DstFactor都为混合因子(系数),ScrFactorA 和 DstFactorA 是透明通道的混合因子。S是源颜色,D是目的颜色。
公式:
Colorrgb = SrcFactor * Srgb + DstFactor * Drgb
Colora = SrcFactorA * Sa + DstFactorA * Da
混合因子:
One因子1
Zero因子0
SrcColor源颜色
SrcAlpha源颜色的Alpha值
DstColor目标颜色值
DstAlpha目标颜色的Alpha值
OneMinusSrcColor1-源颜色值
OneMinusSrcAlpha1-源颜色的Alpha值
OneMinusDstColor1-目标颜色值
OneMinusDstAlpha1-目标颜色的Alpha值
混合操作指令:BlendOp Operation
Add将源颜色和目的颜色相加(默认)
Sub源颜色减去目的颜色
RevSub目的颜色减去源颜色
Min取源颜色和目的颜色中较小值,逐分量比较
Max取源颜色和目的颜色中较大值,逐分量比较
常见混合命令:
Blend SrcAlpha OneMinusSrcAlpha传统透明度
Blend One OneMinusSrcAlpha预乘透明度
Blend One One叠加
Blend OneMinusDstColor One滤色
Blend DstColor Zero正片叠底
Blend DstColor SrcColor两倍相乘
BlendOp Min
Blend One One
变暗
BlendOp Max
Blend One One
变亮
源颜色(S):片段颜色 目的颜色(D):缓冲取颜色

CG标准库函数

功能描述
数学函数
abs(x)x的绝对值
acos(x)x的反余弦
all(x)x的每个分量不等于0返回true,否则返回true
any(x)x的任何组件不等于0,则返回true,否则返回false
asin(x)x的反正弦
atan(x)x的反正切
atan2(y,x)y/x的反正切
ceil(x)向下取整
clamp(x,a,b)限制x的范围在a和b之间,如果x小于a则返回a,如果x大于b返回b,否则返回x
cos(x)x的余弦
cosh(x)x的双曲余弦
cross(a,b)a和b的叉积,a和b都是向量
degrees(x)radTodeg转换
determinant(m)矩阵m的行列式
dot(a,b)a和b的点积
exp(x)指数
exp2(x)以2为底数的指数
floor(x)最大整数,不大于x
fmod(x,y)x/y的余数,与x的符号相同
frac(x)x的分数
frexp(x,out exp)将x分割为区间[1/2,1]中的归一化分数,其返回,并且幂2,存在exp中
isfinite(x)x是有限的则返回true
isinf(x)x是无穷的返回true
isnan(x)x是NaN(非数字)返回true
ldexp(x,n)x*2n
lerp(a,b,f)线性插值,(1-f)a+bf
lit(a,b,m)计算环境光,漫反射和镜面光的照明系数
log(x)自然数对数ln(x)
log2(x)基于2的对数x
log10(x)基于10的对数
max(a,b)返回最大值
min(a,b)返回最小值
modf(x,out ip)将x拆分为整数和小数部分,每部分都具有与x相同的符号。
mul(m,n)矩阵m和矩阵n的乘积
mul(m,v)矩阵m和列向量v的乘积
mul(v,m)行向量v与矩阵m的乘积
noise(x)一维,二维或三位噪声函数,取决于参数的类型,返回值介于0-1之间。并对于输入的给定值始终相同
pow(x,y)xy
radians(x)度数到弧度转换
round(x)最接近x的整数
rsqrt(x)x的倒数平方根
saturate(x)将x定位到[0,1]范围
sign(x)符号, 1, 0 或 -1 ,sign(x)或者Sign(x)叫做符号函数,在数学和计算机运算中,其功能是取某个数的符号(正或负)
sin(x)x的正弦
sincos(float x,out s,out e)s设置为x的正弦,e设置为x的余弦值
sinh(x)x的双曲正弦
smoothstep(min,max,x)对于min和max 之间的x值,返回一个平滑变化的值,范围从x=min时的0到x=max时的1
step(a,x)x<a 为0,x>=a为1
sqrt(x)x的平方根
tan(x)x的正切
tanh(x)x的双曲正切
transpose(m)矩阵m的矩阵转置

语义:
|名称|类别|类型(通常)|描述|

UNITY_PROJ_COORDincUNITY_PROJ_COORD(a)输入一个四维向量,返回一个适合投影纹理读取的纹理坐标。大多数平台上,这直接返回给定值。
POSITION应用到顶点着色器(app2vertiex)float4模型空间中的顶点位置
NORMAL(同上)float3顶点法线
TANGENT(同上)float4顶点切线
TEXCOORD0 ~ TEXCOORD7(同上)float2或float4顶点的纹理坐标,TEXCOORD0表示第一组纹理坐标,以此类推
COLOR(同上)fixed4或float4顶点颜色
SV_POSITION顶点着色器到片元着色器float4裁剪空间中的顶点坐标,结构体中必须包含一个用该语义修饰的变量,等同于DircetX9中的POSITION,但最好使用SV_POSITION
COLOR0(同上)fixed4或float4输出第一组顶点颜色
COLOR2(同上)fixed4或float4输出第二组顶点颜色
TEXCOORD0~TEXCOORD7(同上)float2或float4输出纹理坐标或其他值
SV_Target片段到最终渲染目标fixed4输出值会存储到渲染目标中,等同于DircetX9中的COLOR,但最好使用SV_TARGET

常用计算:

用途实现
计算观察方向float3 viewDir = normalize(_ - mul(unity_ObjectToWorld,模型空间顶点坐标).xyz)

normalize(UnityWorldSpaceViewDir(mul(unity_ObjectToWorld, v.vertex)))
模型空间坐标转换为世界空间坐标mul(unity_ObjectToWorld,模型空间顶点坐标)
获取屏幕坐标ComputeScreenPos(齐次空间坐标)
获取齐次空间坐标UnityObjectToClipPos(模型空间坐标)

UnityWorldToClipPos(世界空间坐标)
获取当前顶点的深度值COMPUTE_EYEDEPTH(存储变量)

本文发布于:2024-02-01 16:51:54,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170677751638070.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:OpenGL.Shader:11
下一篇:训练周记
标签:Shader
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23