Uncaught ERROR: 'if' : syntax error. Two rotation matrices in one shader
Uncaught ERROR: 'if' : syntax error. Two rotation matrices in one shader
我想把两个rotation matrices
合二为一shader
。我输入了条件,但出现错误。这与什么有关,如何解决?
shader(`
attribute vec2 v;
uniform float time;
varying vec3 c;
if (shift>0.2) {
mat3 rotateX(float a) {
return mat3(vec3( -1.0, -1.0, 0.0),
vec3( -1.0, cos(a), -sin(a)),
vec3( 2.0, sin(a), cos(a)));
}
mat3 rotateY(float a){
return mat3(vec3( cos(a), 0.0, sin(a)),
vec3( 0.0, 1.0, 0.0),
vec3(-sin(a), 0.0, cos(a)));
}
mat3 rotateZ(float a){
return mat3(vec3( cos(a), -sin(a), 0.0),
vec3( sin(a), cos(a), 0.0),
vec3( 0.0, 0.0, 1.0));
}
} else {
mat3 rotateX(float a) {
return mat3(vec3( -1.0, -1.0, 0.0),
vec3( -1.0, cos(a), -sin(a)),
vec3( 2.0, sin(a), cos(a)));
}
mat3 rotateY(float a){
return mat3(vec3( cos(a), 0.0, sin(a)),
vec3( 0.0, 1.0, 0.0),
vec3(-sin(a), 0.0, cos(a)));
}
mat3 rotateZ(float a){
return mat3(vec3( cos(a), -sin(a), 0.0),
vec3( sin(a), cos(a), 0.0),
vec3( 0.0, 0.0, 1.0));
}
}
void main(void) {
vec2 p = v;
p.y += sin(p.x*4.)*noise(time/100.)+0.5;
p.x += sin(time/6. + p.y);
vec3 pos = vec3(p.xy, 1.)*rotateX(p.x*4. + time);
gl_Position = vec4(pos, 1.);
gl_PointSize = 2.7;
gl_Position.z = 0.0;
c.rgb=vec3(0.47, 0.56, 0.61);
}
`, gl.VERTEX_SHADER);
所有代码都在这里 - https://codepen.io/m0nte-cr1st0/pen/PMdWKm?editors=0010
您不能在全局范围内使用流程控制语句,也不能在 GLSL 中使用动态函数声明,而且 shift
未定义。
我不明白你想做什么。
首先,您不能像那样在 GLSL 中有条件地创建函数。
但是其次,为什么不直接将参数传递给您的旋转函数以进行任何您想更改的操作,而不是尝试对多个函数进行硬编码?
就像你在制作
if (cond) {
float add(a) {
return a + 1.0;
}
} else {
float add(a) {
return a + 2.0;
}
}
float foo = add(bar);
}
什么时候你可以做
float add(a, b) {
return a + b;
}
float v = cond ? 2.0 : 1.0;
float foo = add(bar);
如果您想根据条件更改某些内容,基本上可以向旋转函数添加更多参数
我想把两个rotation matrices
合二为一shader
。我输入了条件,但出现错误。这与什么有关,如何解决?
shader(`
attribute vec2 v;
uniform float time;
varying vec3 c;
if (shift>0.2) {
mat3 rotateX(float a) {
return mat3(vec3( -1.0, -1.0, 0.0),
vec3( -1.0, cos(a), -sin(a)),
vec3( 2.0, sin(a), cos(a)));
}
mat3 rotateY(float a){
return mat3(vec3( cos(a), 0.0, sin(a)),
vec3( 0.0, 1.0, 0.0),
vec3(-sin(a), 0.0, cos(a)));
}
mat3 rotateZ(float a){
return mat3(vec3( cos(a), -sin(a), 0.0),
vec3( sin(a), cos(a), 0.0),
vec3( 0.0, 0.0, 1.0));
}
} else {
mat3 rotateX(float a) {
return mat3(vec3( -1.0, -1.0, 0.0),
vec3( -1.0, cos(a), -sin(a)),
vec3( 2.0, sin(a), cos(a)));
}
mat3 rotateY(float a){
return mat3(vec3( cos(a), 0.0, sin(a)),
vec3( 0.0, 1.0, 0.0),
vec3(-sin(a), 0.0, cos(a)));
}
mat3 rotateZ(float a){
return mat3(vec3( cos(a), -sin(a), 0.0),
vec3( sin(a), cos(a), 0.0),
vec3( 0.0, 0.0, 1.0));
}
}
void main(void) {
vec2 p = v;
p.y += sin(p.x*4.)*noise(time/100.)+0.5;
p.x += sin(time/6. + p.y);
vec3 pos = vec3(p.xy, 1.)*rotateX(p.x*4. + time);
gl_Position = vec4(pos, 1.);
gl_PointSize = 2.7;
gl_Position.z = 0.0;
c.rgb=vec3(0.47, 0.56, 0.61);
}
`, gl.VERTEX_SHADER);
所有代码都在这里 - https://codepen.io/m0nte-cr1st0/pen/PMdWKm?editors=0010
您不能在全局范围内使用流程控制语句,也不能在 GLSL 中使用动态函数声明,而且 shift
未定义。
我不明白你想做什么。
首先,您不能像那样在 GLSL 中有条件地创建函数。
但是其次,为什么不直接将参数传递给您的旋转函数以进行任何您想更改的操作,而不是尝试对多个函数进行硬编码?
就像你在制作
if (cond) {
float add(a) {
return a + 1.0;
}
} else {
float add(a) {
return a + 2.0;
}
}
float foo = add(bar);
}
什么时候你可以做
float add(a, b) {
return a + b;
}
float v = cond ? 2.0 : 1.0;
float foo = add(bar);
如果您想根据条件更改某些内容,基本上可以向旋转函数添加更多参数