GLSL (parça gölgelendirici) kullanarak bir 2D OpenGL dokusu tonunu etkili bir şekilde değiştirmek için bir yol var mı?GLSL ile bir doku tonunu nasıl değiştirebilirim?
Birisi bunun için bir kod var mı?
GÜNCELLEME: Bu user1118321 öneri kaynaklanan kodudur:
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);
}
Ve bu referans ile karşılaştırıldığında sonucudur:
Birlikte I geçmek için çalıştık Q içinde atan ama sonuçta bile 0 °
var herhangi bir ipucu?
karşılaştırma için Gerekirse, bu orijinal değiştirilmemiş görüntü: Ne @awoodland diyor doğrudur
O (1,1,1) vektörü etrafında üçlü RGB bir rotasyon var - gölgelendiriciye – Flexo
bir matris çarpımı olarak ifade edebilirim ki, senin tonu kayması sonra atlayabilirsiniz sabit ise atan, sqrt, sin, ve cos. Yaptığınız şey onları kutupsal koordinatlara dönüştürmek, açıya eklemek ve geri dönüştürmek. Bu matematiği 2x2 rotasyon matrisi ile yapabilirsiniz. Yiq alanında başka bir matematik yapmanız gerekmiyorsa, tüm dönüşümü önceden hesaplayabilirsiniz.Rgb2yiq'inizi 2d döndürme ile (3x3'e kadar çikarilir) ve daha sonra yiq2rgb ile tüm islemi yapan büyük bir 3x3 matrisini elde edin. @Flexo'nun söylediği gibi (1,1,1) vektörü etrafında sadece bir dönüş. –