GLSL(フラグメントシェーダ)を使用して2D OpenGLテクスチャの色相を効率的に変更する方法はありますか?GLSLでテクスチャの色合いを変更するにはどうすればいいですか?
誰かにコードがありますか?
UPDATE:これはuser1118321提案に起因するコードである:
uniform sampler2DRect texture;
const mat3 rgb2yiq = mat3(0.299, 0.587, 0.114, 0.595716, -0.274453, -0.321263, 0.211456, -0.522591, 0.311135);
const mat3 yiq2rgb = mat3(1.0, 0.9563, 0.6210, 1.0, -0.2721, -0.6474, 1.0, -1.1070, 1.7046);
uniform float hue;
void main() {
vec3 yColor = rgb2yiq * texture2DRect(texture, gl_TexCoord[0].st).rgb;
float originalHue = atan(yColor.b, yColor.g);
float finalHue = originalHue + hue;
float chroma = sqrt(yColor.b*yColor.b+yColor.g*yColor.g);
vec3 yFinalColor = vec3(yColor.r, chroma * cos(finalHue), chroma * sin(finalHue));
gl_FragColor = vec4(yiq2rgb*yFinalColor, 1.0);
}
そして、これは、基準と比較した結果である:私は私を切り替えることを試みた
Q内のatanしかし結果は間違っても約0°
何かヒント?
比較のために必要であればが、これはオリジナルの無修正画像です:何@awoodland言うことは正しいです
それは(1,1,1)ベクトルの周りのトリプルRGBの回転だ - あなたの色相シフトが一定である場合は、シェーダ – Flexo
で行列の乗算としてそれを表現することができ、あなたはスキップすることができますatan、sqrt、sin、およびcosです。あなたがしているのは、それらを極座標に変換し、角度に加え、変換することです。この計算は2x2回転行列で行うことができます。 yiq空間で他の計算を行う必要がない場合は、変換全体を事前に計算することができます。あなたのrgb2yiqに2次元回転(3x3にパディング)とyiq2rgbを掛け合わせると、プロセス全体を行う1つの大きな3x3行列が得られます。 @Flexoのように、(1,1,1)ベクトルのまわりを回転するだけです。 –