Unity&Shader常用函式的使用方法
1、Step(a,x):如果x<a返回0;如果x>或=a返回1
2、Clamp(x,a,a):如果x<a返回a;如果x>b返回b;如果在a和b之間就返回x
3、smoothstep(min,max,x):返回的值為–2*(( x – min )/( max – min ))3 +3*(( x – min )/( max – min ))2
4、lerp(a,b,f):線性插值函式,返回值為(1-f)*a+b*f
5、三角函式sin、cos
二、常用函式的使用例項
1、Step函式,在中的Shader例項程式碼如下:
Shader "Unlit/Chapter5-Step"
{
Properties
{
_background("背景色",Color)=(0,0,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _background;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.y = 1 - o.uv.y;
return o;
}
// Functions
fixed4 frag(v2f i) : SV_Target
{
float2 r = 2.0*(i.uv - 0.5);
//_ScreenParams是Unity內建的變數
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
fixed3 pixel = _background.xyz;
float edge, variable, ret;
//將螢幕劃分成五個部分
//第一部分
if (r.x < -0.6*aspectRatio)
{
variable = r.y;
edge = 0.2;
if (variable > edge)
{
ret = 1.0;
}
else
{
ret = 0;
}
}
else if (r.x < -0.2*aspectRatio)
{
variable = r.y;
edge = -0.2;
//step(a,x):如果x<a結果返回0,反之返回1
ret = step(edge, variable);
}
else if (r.x < 0.2*aspectRatio)
{
ret = 1.0 - step(0.5, r.y);
}
else if (r.x < 0.6*aspectRatio)
{
ret = 0.3 + 0.5*step(-0.4, r.y);
}
else
{
ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
}
pixel = fixed3(ret, ret, ret);
return fixed4(pixel, 1.0);
}
ENDCG
}
}
}
2、Clamp函式,在Unity中的Shader例項程式碼如下:
Shader "Unlit/Chapter5-Step"
{
Properties
{
_background("背景色",Color)=(0,0,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _background;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.y = 1 - o.uv.y;
return o;
}
// Functions
fixed4 frag(v2f i) : SV_Target
{
float2 r = 2.0*(i.uv - 0.5);
//_ScreenParams是Unity內建的變數
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
fixed3 pixel = _background.xyz;
float edge, variable, ret;
//將螢幕劃分成五個部分
//第一部分
if (r.x < -0.6*aspectRatio)
{
variable = r.y;
edge = 0.2;
if (variable > edge)
{
ret = 1.0;
}
else
{
ret = 0;
}
}
else if (r.x < -0.2*aspectRatio)
{
variable = r.y;
edge = -0.2;
//step(a,x):如果x<a結果返回0,反之返回1
ret = step(edge, variable);
}
else if (r.x < 0.2*aspectRatio)
{
ret = 1.0 - step(0.5, r.y);
}
else if (r.x < 0.6*aspectRatio)
{
ret = 0.3 + 0.5*step(-0.4, r.y);
}
else
{
ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
}
pixel = fixed3(ret, ret, ret);
return fixed4(pixel, 1.0);
}
ENDCG
}
}
}
3、smoothstep,這個指令碼只給出片段著色器部分,其他部分同2,程式碼如下:
Shader "Unlit/Chapter5-Step"
{
Properties
{
_background("背景色",Color)=(0,0,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _background;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.y = 1 - o.uv.y;
return o;
}
// Functions
fixed4 frag(v2f i) : SV_Target
{
float2 r = 2.0*(i.uv - 0.5);
//_ScreenParams是Unity內建的變數
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
fixed3 pixel = _background.xyz;
float edge, variable, ret;
//將螢幕劃分成五個部分
//第一部分
if (r.x < -0.6*aspectRatio)
{
variable = r.y;
edge = 0.2;
if (variable > edge)
{
ret = 1.0;
}
else
{
ret = 0;
}
}
else if (r.x < -0.2*aspectRatio)
{
variable = r.y;
edge = -0.2;
//step(a,x):如果x<a結果返回0,反之返回1
ret = step(edge, variable);
}
else if (r.x < 0.2*aspectRatio)
{
ret = 1.0 - step(0.5, r.y);
}
else if (r.x < 0.6*aspectRatio)
{
ret = 0.3 + 0.5*step(-0.4, r.y);
}
else
{
ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
}
pixel = fixed3(ret, ret, ret);
return fixed4(pixel, 1.0);
}
ENDCG
}
}
4、lerp函式,Unity中的Shader程式碼如下:
Shader "Unlit/Chapter5-Step"
{
Properties
{
_background("背景色",Color)=(0,0,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _background;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.y = 1 - o.uv.y;
return o;
}
// Functions
fixed4 frag(v2f i) : SV_Target
{
float2 r = 2.0*(i.uv - 0.5);
//_ScreenParams是Unity內建的變數
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
fixed3 pixel = _background.xyz;
float edge, variable, ret;
//將螢幕劃分成五個部分
//第一部分
if (r.x < -0.6*aspectRatio)
{
variable = r.y;
edge = 0.2;
if (variable > edge)
{
ret = 1.0;
}
else
{
ret = 0;
}
}
else if (r.x < -0.2*aspectRatio)
{
variable = r.y;
edge = -0.2;
//step(a,x):如果x<a結果返回0,反之返回1
ret = step(edge, variable);
}
else if (r.x < 0.2*aspectRatio)
{
ret = 1.0 - step(0.5, r.y);
}
else if (r.x < 0.6*aspectRatio)
{
ret = 0.3 + 0.5*step(-0.4, r.y);
}
else
{
ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
}
pixel = fixed3(ret, ret, ret);
return fixed4(pixel, 1.0);
}
ENDCG
}
}
}
5、lerp函式與直接的顏色加減進行對比:完整的Shader程式碼如下:
Shader "Unlit/Chapter5-Step"
{
Properties
{
_background("背景色",Color)=(0,0,0,0)
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
CGINCLUDE
ENDCG
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
float4 _background;
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = v.uv;
o.uv.y = 1 - o.uv.y;
return o;
}
// Functions
fixed4 frag(v2f i) : SV_Target
{
float2 r = 2.0*(i.uv - 0.5);
//_ScreenParams是Unity內建的變數
float aspectRatio = _ScreenParams.x / _ScreenParams.y;
r.x *= aspectRatio;
fixed3 pixel = _background.xyz;
float edge, variable, ret;
//將螢幕劃分成五個部分
//第一部分
if (r.x < -0.6*aspectRatio)
{
variable = r.y;
edge = 0.2;
if (variable > edge)
{
ret = 1.0;
}
else
{
ret = 0;
}
}
else if (r.x < -0.2*aspectRatio)
{
variable = r.y;
edge = -0.2;
//step(a,x):如果x<a結果返回0,反之返回1
ret = step(edge, variable);
}
else if (r.x < 0.2*aspectRatio)
{
ret = 1.0 - step(0.5, r.y);
}
else if (r.x < 0.6*aspectRatio)
{
ret = 0.3 + 0.5*step(-0.4, r.y);
}
else
{
ret = step(-0.3, r.y) * (1.0 - step(0.2, r.y));
}
pixel = fixed3(ret, ret, ret);
return fixed4(pixel, 1.0);
}
ENDCG
}
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009264/viewspace-2895896/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ORACLE常用結構和函式使用方法總結Oracle函式
- round函式與trunc函式的使用方法函式
- 友元函式的使用方法函式
- 【函式】Oracle中聚合函式rank()使用方法函式Oracle
- Mysql 常用函式(1)- 常用函式彙總MySql函式
- 常用的Css函式CSS函式
- Js常用的函式JS函式
- CUDA 常用的函式函式
- Oracle常用的函式Oracle函式
- Java script 中的函式使用方法Java函式
- Django中 render() 函式的使用方法Django函式
- js中split函式的使用方法JS函式
- 常用函式函式
- 常用函式--時間函式函式
- Python中zip函式的使用方法Python函式
- Mysql 常用函式(15)- upper 函式MySql函式
- python的常用函式Python函式
- PHP 常用函式PHP函式
- PHP常用函式PHP函式
- js 常用函式JS函式
- MySQL 常用函式MySql函式
- MySQL 常用函式。MySql函式
- 常用函式集合函式
- 常用助手函式函式
- 常用函式整理函式
- jQuery常用函式jQuery函式
- SqlServer常用函式SQLServer函式
- js常用函式JS函式
- ORACLE 常用 函式Oracle函式
- MySQL常用函式MySql函式
- oracle 常用函式Oracle函式
- RFT常用函式函式
- Oracle常用函式Oracle函式
- QT常用函式QT函式
- excel中最常用的30個函式 excel表格常用函式技巧大全Excel函式
- Hive常用函式及自定義函式Hive函式
- 核函式 多項式核函式 高斯核函式(常用)函式
- Python列表中set函式的使用方法!Python函式