本帖最后由 aiRadioS 于 2026-3-16 17:47 编辑
这是shader代码
[RenPy] 纯文本查看 复制代码 renpy.register_shader("ring.pulse",variables="""
uniform float u_frequency; //波密度 控制波的数量
uniform float u_time;
uniform vec2 u_anchor; //圆环出现的锚点坐标
uniform float u_width; //控制波宽 范围(-1,1)越小波越宽
uniform float u_speed; //频率 控制波速
uniform sampler2D tex0;
uniform vec2 u_model_size; //使用的素材尺寸,为renpy内置变量
varying vec2 v_tex_coord;
""",vertex_200="""
v_tex_coord=a_tex_coord;
""",fragment_300="""
vec2 uv=v_tex_coord; //因为v_tex_coord不能被修改 所以赋值给uv
uv.x*=u_model_size.x/u_model_size.y; //因为图片不是正方形,归一化坐标对应的像素长度不一样,消除宽高差,防止圆环变成椭圆换 变换后u_anchor的坐标记得改呦 例如(1920,1080)的中心是(8/9,0.5)
float dist=distance(uv,u_anchor); //计算各点到锚点的距离
float phase=u_frequency*dist-u_time*u_speed; //行波相位公式 phase=k*x-wt
float wave=sin(phase); //震动到的位置 为1时是u_time时间点 位置对应波峰
float alpha=step(u_width,wave); //step(edge,x) 当x<edge时,x均取0 当x>edge时,x取1 利用这个函数 把震动到(u_width,1)的点显示出来 其他点完全透明
vec4 color=texture2D(tex0,uv); //采集纹理颜色赋值给color
//if(alpha==0){
// gl_FragColor=vec4(0.0,0.0,0.0,0.0); //防止颜色残留
//}else{
// gl_FragColor=vec4(color.rgb,alpha);
//}
gl_FragColor=vec4(color.rgb,alpha);
""")
transform ring_pulse:
shader "ring.pulse"
blend "normal"
u_frequency 100
u_speed 15
u_width 0.99
u_anchor(8/9,0.5)
pause 0.0 #和下面那一行一起防止卡顿
repeat
效果:
下面是去掉注释让alpha=0时,gl_FragColor=vec4(0.0,0.0,0.0,0.0);的代码
[RenPy] 纯文本查看 复制代码 renpy.register_shader("ring.pulse",variables="""
uniform float u_frequency; //波密度 控制波的数量
uniform float u_time;
uniform vec2 u_anchor; //圆环出现的锚点坐标
uniform float u_width; //控制波宽 范围(-1,1)越小波越宽
uniform float u_speed; //频率 控制波速
uniform sampler2D tex0;
uniform vec2 u_model_size; //使用的素材尺寸,为renpy内置变量
varying vec2 v_tex_coord;
""",vertex_200="""
v_tex_coord=a_tex_coord;
""",fragment_300="""
vec2 uv=v_tex_coord; //因为v_tex_coord不能被修改 所以赋值给uv
uv.x*=u_model_size.x/u_model_size.y; //因为图片不是正方形,归一化坐标对应的像素长度不一样,消除宽高差,防止圆环变成椭圆换 变换后u_anchor的坐标记得改呦 例如(1920,1080)的中心是(8/9,0.5)
float dist=distance(uv,u_anchor); //计算各点到锚点的距离
float phase=u_frequency*dist-u_time*u_speed; //行波相位公式 phase=k*x-wt
float wave=sin(phase); //震动到的位置 为1时是u_time时间点 位置对应波峰
float alpha=step(u_width,wave); //step(edge,x) 当x<edge时,x均取0 当x>edge时,x取1 利用这个函数 把震动到(u_width,1)的点显示出来 其他点完全透明
vec4 color=texture2D(tex0,uv); //采集纹理颜色赋值给color
if(alpha==0){
gl_FragColor=vec4(0.0,0.0,0.0,0.0); //防止颜色残留
}else{
gl_FragColor=vec4(color.rgb,alpha);
}
//gl_FragColor=vec4(color.rgb,alpha);
""")
transform ring_pulse:
shader "ring.pulse"
blend "normal"
u_frequency 100
u_speed 15
u_width 0.99
u_anchor(8/9,0.5)
pause 0.0 #和下面那一行一起防止卡顿
repeat
效果:
|