通过找到一种方法来删除许多 if 语句来简化代码
Simplify code by finding a way to remove many if statements
我在寻找构建代码的好方法时遇到了麻烦。我正在用 GLSL 编写着色器。我正在使用 WebGL。所以我有一个包含 22 个项目的精灵 sheet。 sheet 是 640 X 640。除了最后一行,每行有 5 个精灵。所以我使用下面的代码来测试一下。
float positionInTime = (currentAge / duration);
positionInTime /= 0.04545;
positionInTime = sign(positionInTime)*floor(abs(positionInTime)+0.5);
vec2 TextureCoord = vec2( 0.0, 0.0 );
if ( positionInTime == 22.0) {
TextureCoord = vec2( 0.0, 0.0 );
}
if ( positionInTime == 21.0) {
TextureCoord = vec2( 0.2, 0.0 );
}
if ( positionInTime == 20.0) {
TextureCoord = vec2( 0.4, 0.0 );
}
if ( positionInTime == 19.0) {
TextureCoord = vec2( 0.6, 0.0 );
}
if ( positionInTime == 18.0) {
TextureCoord = vec2( 0.8, 0.0 );
}
if ( positionInTime == 17.0) {
TextureCoord = vec2( 0.0, 0.2 );
}
if ( positionInTime == 16.0) {
TextureCoord = vec2( 0.2, 0.2 );
}
if ( positionInTime == 15.0) {
TextureCoord = vec2( 0.4, 0.2 );
}
if ( positionInTime == 14.0) {
TextureCoord = vec2( 0.6, 0.2 );
}
if ( positionInTime == 13.0) {
TextureCoord = vec2( 0.8, 0.2 );
}
if ( positionInTime == 12.0) {
TextureCoord = vec2( 0.0, 0.4 );
}
if ( positionInTime == 11.0) {
TextureCoord = vec2( 0.2, 0.4 );
}
if ( positionInTime == 10.0) {
TextureCoord = vec2( 0.4, 0.4 );
}
if ( positionInTime == 9.0) {
TextureCoord = vec2( 0.6, 0.4 );
}
if ( positionInTime == 8.0) {
TextureCoord = vec2( 0.8, 0.4 );
}
if ( positionInTime == 7.0) {
TextureCoord = vec2( 0.0, 0.6 );
}
if ( positionInTime == 6.0) {
TextureCoord = vec2( 0.2, 0.6 );
}
if ( positionInTime == 5.0) {
TextureCoord = vec2( 0.4, 0.6 );
}
if ( positionInTime == 4.0) {
TextureCoord = vec2( 0.6, 0.6 );
}
if ( positionInTime == 3.0) {
TextureCoord = vec2( 0.8, 0.8 );
}
if ( positionInTime == 2.0) {
TextureCoord = vec2( 0.0, 0.8 );
}
if ( positionInTime == 1.0) {
TextureCoord = vec2( 0.2, 0.8 );
}
vec2 TextureSize = vec2(.2, .2);
mediump vec2 realTexCoord = TextureCoord + (gl_PointCoord * TextureSize);
vec4 rotatedTexture = texture2D( texture, realTexCoord );
gl_FragColor = rotatedTexture;
}
代码有效,但我想对其进行改进。这些 if 状态似乎可以通过 for 循环大大简化。有人有想法么?或者,如果可以为 TextureCoord x 和 y 创建 2 个变量,那就太好了。
您可以创建 vec2 数组并使用舍入的 positionInTime 作为该数组的索引,无需循环。
你也可以计算每个向量,但如果值有规律性。以下代码有疑问:
if ( positionInTime == 7.0) {
TextureCoord = vec2( 0.0, 0.6 );
}
if ( positionInTime == 6.0) {
TextureCoord = vec2( 0.4, 0.6 );
}
我认为有错误(0.4 而不是 0.2)。
如果您可以更改为 5x5 的简单模式,这将在 Javascript:
中计算
var x = ((25 - positionInTime) % 5) / 5.0;
var y = Math.floor((25 - positionInTime) / 5) / 10.0;
TextureCoord = vec2(x, y);
如果没有,您可以使用:
if (positionInTime > 22) {
var x = 0;
var y = 0;
if (positionInTime > 7) {
x = ((22 - positionInTime) % 5) / 5.0;
y = Math.floor((22 - positionInTime) / 5) / 10.0;
} else {
x = ((7 - positionInTime) % 4) / 5.0;
y = Math.floor((7 - positionInTime) / 5) / 10.0;
}
TextureCoord = vec2(x, y);
我在寻找构建代码的好方法时遇到了麻烦。我正在用 GLSL 编写着色器。我正在使用 WebGL。所以我有一个包含 22 个项目的精灵 sheet。 sheet 是 640 X 640。除了最后一行,每行有 5 个精灵。所以我使用下面的代码来测试一下。
float positionInTime = (currentAge / duration);
positionInTime /= 0.04545;
positionInTime = sign(positionInTime)*floor(abs(positionInTime)+0.5);
vec2 TextureCoord = vec2( 0.0, 0.0 );
if ( positionInTime == 22.0) {
TextureCoord = vec2( 0.0, 0.0 );
}
if ( positionInTime == 21.0) {
TextureCoord = vec2( 0.2, 0.0 );
}
if ( positionInTime == 20.0) {
TextureCoord = vec2( 0.4, 0.0 );
}
if ( positionInTime == 19.0) {
TextureCoord = vec2( 0.6, 0.0 );
}
if ( positionInTime == 18.0) {
TextureCoord = vec2( 0.8, 0.0 );
}
if ( positionInTime == 17.0) {
TextureCoord = vec2( 0.0, 0.2 );
}
if ( positionInTime == 16.0) {
TextureCoord = vec2( 0.2, 0.2 );
}
if ( positionInTime == 15.0) {
TextureCoord = vec2( 0.4, 0.2 );
}
if ( positionInTime == 14.0) {
TextureCoord = vec2( 0.6, 0.2 );
}
if ( positionInTime == 13.0) {
TextureCoord = vec2( 0.8, 0.2 );
}
if ( positionInTime == 12.0) {
TextureCoord = vec2( 0.0, 0.4 );
}
if ( positionInTime == 11.0) {
TextureCoord = vec2( 0.2, 0.4 );
}
if ( positionInTime == 10.0) {
TextureCoord = vec2( 0.4, 0.4 );
}
if ( positionInTime == 9.0) {
TextureCoord = vec2( 0.6, 0.4 );
}
if ( positionInTime == 8.0) {
TextureCoord = vec2( 0.8, 0.4 );
}
if ( positionInTime == 7.0) {
TextureCoord = vec2( 0.0, 0.6 );
}
if ( positionInTime == 6.0) {
TextureCoord = vec2( 0.2, 0.6 );
}
if ( positionInTime == 5.0) {
TextureCoord = vec2( 0.4, 0.6 );
}
if ( positionInTime == 4.0) {
TextureCoord = vec2( 0.6, 0.6 );
}
if ( positionInTime == 3.0) {
TextureCoord = vec2( 0.8, 0.8 );
}
if ( positionInTime == 2.0) {
TextureCoord = vec2( 0.0, 0.8 );
}
if ( positionInTime == 1.0) {
TextureCoord = vec2( 0.2, 0.8 );
}
vec2 TextureSize = vec2(.2, .2);
mediump vec2 realTexCoord = TextureCoord + (gl_PointCoord * TextureSize);
vec4 rotatedTexture = texture2D( texture, realTexCoord );
gl_FragColor = rotatedTexture;
}
代码有效,但我想对其进行改进。这些 if 状态似乎可以通过 for 循环大大简化。有人有想法么?或者,如果可以为 TextureCoord x 和 y 创建 2 个变量,那就太好了。
您可以创建 vec2 数组并使用舍入的 positionInTime 作为该数组的索引,无需循环。
你也可以计算每个向量,但如果值有规律性。以下代码有疑问:
if ( positionInTime == 7.0) {
TextureCoord = vec2( 0.0, 0.6 );
}
if ( positionInTime == 6.0) {
TextureCoord = vec2( 0.4, 0.6 );
}
我认为有错误(0.4 而不是 0.2)。
如果您可以更改为 5x5 的简单模式,这将在 Javascript:
中计算var x = ((25 - positionInTime) % 5) / 5.0;
var y = Math.floor((25 - positionInTime) / 5) / 10.0;
TextureCoord = vec2(x, y);
如果没有,您可以使用:
if (positionInTime > 22) {
var x = 0;
var y = 0;
if (positionInTime > 7) {
x = ((22 - positionInTime) % 5) / 5.0;
y = Math.floor((22 - positionInTime) / 5) / 10.0;
} else {
x = ((7 - positionInTime) % 4) / 5.0;
y = Math.floor((7 - positionInTime) / 5) / 10.0;
}
TextureCoord = vec2(x, y);