1
0

shader从入门到放弃(2) 常用函数

2026-09-08
2026-09-08

shader的入门到放弃

例子

//传入原始坐标,进行归一化,网格规则的格子是长方形,传入网格的数量
vec3 grid_rect(vec2 coord,float grid_size){
    vec3 color = vec3(0.0);
    
    vec2 uv = (coord/iResolution.xy -0.5) * 2.0;
    vec2 cell =1.0 - 2.0 * abs(fract(uv * grid_size * 0.5) - 0.5);
    
    //通用的颜色设置
    color = step(cell.x,fwidth(cell.x)) * vec3(1.0) + step(cell.y,fwidth(cell.y)) * vec3(1.0);
    //坐标轴颜色设置
    //vec3 color2 = step(abs(uv.x),fwidth(uv.x)) * vec3(0.0,1.0,0.0) + step(abs(uv.y),fwidth(uv.y)) * vec3(0.0,1.0,0.0);
    color = mix(color,vec3(0.0,1.0,0.0),step(abs(uv.x),fwidth(uv.x)));
    color = mix(color,vec3(0.0,1.0,0.0),step(abs(uv.y),fwidth(uv.y)));

    return color; 
}

//传入原始坐标,进行归一化,正常的方格子
vec3 grid(vec2 coord,float grid_size){
    vec3 color = vec3(0.0);
    
    vec2 uv = (coord - 0.5 * iResolution.xy) /min(iResolution.y,iResolution.x) * 2.0;
    vec2 cell =1.0 - 2.0 * abs(fract(uv * grid_size * 0.5) - 0.5);
    
    //通用的颜色设置
    color = step(cell.x,fwidth(cell.x)) * vec3(1.0) + step(cell.y,fwidth(cell.y)) * vec3(1.0);
    //坐标轴颜色设置
    //vec3 color2 = step(abs(uv.x),fwidth(uv.x)) * vec3(0.0,1.0,0.0) + step(abs(uv.y),fwidth(uv.y)) * vec3(0.0,1.0,0.0);
    color = mix(color,vec3(0.0,1.0,0.0),step(abs(uv.x),fwidth(uv.x)));
    color = mix(color,vec3(0.0,1.0,0.0),step(abs(uv.y),fwidth(uv.y)));

    return color; 
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // 测试 这个是生产正方形 标注你的网格
    fragColor = vec4(grid(fragCoord,10.0),1.0);
    //测试 这个生产的是长方形的
    //fragColor = vec4(grid_rect(fragCoord,10.0),1.0);
}

上面是实现了一个,实现了一个画出网格的基础功能的示例

常用函数

fwidth(float x)

  • 传入一个数值,计算横向相邻的像素的dx,也就是求导,求变化值,这个方向有GPU去决定的
  • 这个值一般比较小,目前的使用就是判断像素值,如果距离小于这个变化值,则给这个像素上色的作用。

fract(vec2)

  • 这是一个取小数的函数,可以传入float吧,也可以传入变量
  • 这个作用就是在每一个去拿小数的位置
  • 这个目前的例子,就是去划分格子

mix(a,b,c)

mix performs a linear interpolation between x and y using a to weight between them. The return value is computed as follows: x⋅(1−a)+y⋅a.

step(a,b)

step generates a step function by comparing x to edge.
For element i of the return value, 0.0 is returned if x[i] < edge[i], and 1.0 is returned otherwise.

  • 代替if的,只会返回0,1 如果a<b则返回0,否则是1

smoothstep

smoothstep performs smooth Hermite interpolation between 0 and 1 when edge0 < x < edge1. This is useful in cases where a threshold function with a smooth transition is desired. smoothstep is equivalent to:

  • 这个用来平滑这个step的。
  • 这个如果是斜线,那么这个肯定会有锯齿,那么这个锯齿就需要使用这个smoothstep去平滑掉

image-wxVp.png
处理前是这样的

image-oaAG.png
他的函数图像是这样的。 这个处理之后的结果是这样的

image-wPVq.png

评论