Có cách nào thay đổi hiệu quả màu sắc của kết cấu 2D OpenGL bằng GLSL (trình đổ bóng phân đoạn) không?Làm thế nào để thay đổi màu sắc của một kết cấu với GLSL?
Có ai đó có một số mã cho nó không?
UPDATE: Đây là mã kết quả từ user1118321 gợi ý:
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);
}
Và đây là kết quả so sánh với một tài liệu tham khảo:
Tôi đã cố gắng để chuyển đổi tôi với Q bên trong nhưng kết quả là sai, ngay cả xung quanh 0 °
Bạn đã có bất kỳ gợi ý nào?
Nếu cần thiết để so sánh, đây là bản gốc hình ảnh chưa sửa đổi:
Đó là một vòng quay của RGB ba xung quanh (1,1,1) vector - bạn có thể bày tỏ rằng như một phép nhân ma trận trong shader – Flexo
Nếu sự thay đổi màu sắc của bạn là không đổi thì bạn có thể bỏ qua atan, sqrt, sin và cos. Những gì bạn đang làm là chuyển đổi chúng thành các tọa độ cực, thêm vào góc và chuyển đổi ngược lại. Bạn có thể thực hiện phép toán này với ma trận xoay 2x2. Nếu bạn không cần thực hiện bất kỳ phép tính nào khác trong không gian yiq, bạn có thể tính toán trước toàn bộ biến đổi.Nhân rgb2yiq của bạn với vòng quay 2d (đệm ra thành 3x3) và sau đó với yiq2rgb để lấy một ma trận 3x3 lớn thực hiện toàn bộ quá trình. Mà, như @ Flexo nói chỉ là một vòng quay quanh (1,1,1) vectơ. –