我有一个 GLSL 着色器,它从输入纹理的一个通道(例如 R)读取,然后写入输出纹理中的同一通道。该频道必须由用户选择。
我现在能想到的就是使用一个 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]
?
或者也许我应该有 4 个不同版本的同一个着色器,每个版本处理一个不同的通道,这样我就可以避免所有的 if 语句?
做这个的最好方式是什么?
编辑:更具体地说,我使用的是 WebGL (Three.js)