【发布时间】:2021-03-29 17:15:53
【问题描述】:
我无法使用 javascript 在 glsl 脚本中提取函数。
这里是 glsl 内容:
precision highp float;
varying vec4 v_color;
#if USE_TEXTURE
varying vec2 v_uv0;
uniform sampler2D texture;
#endif
vec2 sfx_func_uv_to_01(vec4 ucrect, vec2 uv) {
return vec2(
sfx_func_uv_to_01(ucrect[0], ucrect[0] + ucrect[2], uv.x),
1.0 - sfx_func_uv_to_01(ucrect[1], ucrect[1] - ucrect[3], uv.y)
);
}
vec2 sfx_func_uv_to_01(vec4 ucrect, vec2 uv) {
return vec2(1.0, 2.0);
}
vec4 sfx_fs_output_uv_quarter(vec2 uv, vec4 color) {
vec4 result = color;
return result;
}
void main () {
vec2 uv = v_uv0;
vec4 color = texture2D(texture, uv);
gl_FragColor = color;
}
我想用正文提取脚本中的 4 个函数。所以我尝试了注册:
/^(vec4|vec3|vec2|float|int).*\{.*\}/gms
而js代码是:
for (const match of glsl1.matchAll(/^(vec4|vec3|vec2|float|int).*\{.*\}/gms)) {
console.log(match[0]);
}
我只得到一个结果,而不是 4 个函数:
vec2 sfx_func_uv_to_01(vec4 ucrect, vec2 uv) {
return vec2(
sfx_func_uv_to_01(ucrect[0], ucrect[0] + ucrect[2], uv.x),
1.0 - sfx_func_uv_to_01(ucrect[1], ucrect[1] - ucrect[3], uv.y)
);
}
vec2 sfx_func_uv_to_01(vec4 ucrect, vec2 uv) {
return vec2(1.0, 2.0);
}
vec4 sfx_fs_output_uv_quarter(vec2 uv, vec4 color) {
vec4 result = color;
return result;
}
void main () {
vec2 uv = v_uv0;
vec4 color = texture2D(texture, uv);
gl_FragColor = color;
}
我为多行文本搜索了非贪婪模式的解决方案,但徒劳无功。
任何建议将不胜感激,谢谢:)
【问题讨论】:
-
对于您当前的情况,稍作修改就足够了 -
^(vec4|vec3|vec2|float|int).*?{.*?}。参考-regex101.com/r/Bukyh0/1。但它不处理函数中有{}的情况。然后模式会变得有点复杂
标签: javascript regex