0x02.Shader函数smoothstep
在Shader编程里,smoothstep
是一个相当常用的函数,其主要作用是在两个指定的值之间生成平滑的过渡。下面为你详细介绍:

Shader "ShaderLearning/Shader09"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
// No culling or depth
Cull Off ZWrite Off ZTest Always
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
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 = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
sampler2D _MainTex;
fixed4 frag(v2f i) : SV_Target
{
float r = smoothstep(0.25, 0.75, i.uv.x);
return fixed4(r, 0, 0, 1);
}
ENDCG
}
}
}
函数定义
在GLSL(OpenGL Shading Language)和HLSL(High-Level Shading Language)中,smoothstep
函数的定义如下:
float smoothstep(float edge0, float edge1, float x);
vec2 smoothstep(vec2 edge0, vec2 edge1, vec2 x);
vec3 smoothstep(vec3 edge0, vec3 edge1, vec3 x);
vec4 smoothstep(vec4 edge0, vec4 edge1, vec4 x);
此函数接收三个参数:
edge0
:过渡的起始值。edge1
:过渡的结束值。x
:需要进行计算的输入值。
工作原理
smoothstep
函数会依据输入值x
,在edge0
和edge1
之间生成平滑的过渡。具体而言,其工作原理如下:
- 当
x <= edge0
时,函数返回0.0
。 - 当
x >= edge1
时,函数返回1.0
。 - 当
edge0 < x < edge1
时,函数会返回一个介于0.0
和1.0
之间的值,该值由平滑的三次多项式决定。
示例代码
以下是一个简单的GLSL片段着色器示例,展示了smoothstep
函数的使用:
#version 330 core
out vec4 FragColor;
void main()
{
// 定义过渡的起始和结束值
float edge0 = 0.2;
float edge1 = 0.8;
// 获取当前片段的归一化坐标
vec2 uv = gl_FragCoord.xy / vec2(800, 600);
// 使用smoothstep函数生成平滑过渡
float value = smoothstep(edge0, edge1, uv.x);
// 设置片段颜色
FragColor = vec4(value, value, value, 1.0);
}
代码解释
- 首先,定义了过渡的起始值
edge0
和结束值edge1
。 - 接着,获取当前片段的归一化坐标
uv
。 - 然后,使用
smoothstep
函数在edge0
和edge1
之间根据uv.x
生成平滑过渡的值。 - 最后,将该值作为颜色的RGB分量,设置片段颜色。
应用场景
smoothstep
函数在Shader编程中有广泛的应用,例如:
- 抗锯齿:在绘制线条或形状时,使用
smoothstep
可以实现平滑的边缘过渡,从而减少锯齿现象。 - 渐变效果:可以创建平滑的颜色渐变,如从一种颜色过渡到另一种颜色。
- 遮罩效果:根据某个条件生成平滑的遮罩,实现逐渐显示或隐藏的效果。
通过合理运用smoothstep
函数,你能够在Shader中创建出各种平滑的过渡效果。