入力テクスチャのチャネルの 1 つ (R など) から読み取り、出力テクスチャの同じチャネルに書き込む GLSL シェーダがあります。このチャンネルはユーザーが選択する必要があります。
私が今考えることができるのは、int ユニフォームと大量の if ステートメントを使用することです。
uniform sampler2D uTexture;
uniform int uChannelId;
varying vec2 vUv;
void main() {
//read in data from texture
vec4 t = texture2D(uTexture, vUv);
float data;
if (uChannelId == 0) {
data = t.r;
} else if (uChannelId == 1) {
data = t.g;
} else if (uChannelId == 2) {
data = t.b;
} else {
data = t.a;
}
//process the data...
float result = data * 2; //for example
//write out
if (uChannelId == 0) {
gl_FragColor = vec4(result, t.g, t.b, t.a);
} else if (uChannelId == 1) {
gl_FragColor = vec4(t.r, result, t.b, t.a);
} else if (uChannelId == 2) {
gl_FragColor = vec4(t.r, t.g, result, t.a);
} else {
gl_FragColor = vec4(t.r, t.g, t.b, result);
}
}
などの辞書アクセスのようなことを行う方法はありますt[uChannelId]
か?
それとも、すべての if ステートメントを回避できるように、同じシェーダーの 4 つの異なるバージョンが必要で、それぞれが異なるチャネルを処理する必要がありますか?
これを行う最善の方法は何ですか?
EDIT:より具体的には、WebGL(Three.js)を使用しています