Thay đổi hình ảnh để nó trông giống như qua kính đầy màu sắc


7

Tôi hiện đang làm việc trên một số pixel shader đơn giản trong HLSL. Tôi gửi cho shader texture và tôi muốn làm cho nó nhiều màu sắc hơn (giống như trong hình dưới đây).

nhập mô tả hình ảnh ở đây

Trong hình 1 có kết cấu ban đầu. Hình 2 cho thấy một hiệu ứng mà tôi muốn đạt được. Có một số công thức toán học để làm điều đó? Đầu vào của tôi là giá trị RGBA của từng pixel.

EDIT: Tôi sẽ cố gắng viết cụ thể hơn.

Hãy nói rằng tôi muốn làm cho kết cấu khu vườn đó đỏ hơn. Tôi cho rằng những gì tôi cần làm là:

OutputR = InputR * X,

OuputG = InputG * Y,

OutputB = InpputB * Z

Nhưng làm thế nào để tôi tìm thấy X, Y và Z?


Khi bạn nói "nhiều màu sắc hơn", bạn có nghĩa là cụ thể như thể nhìn qua kính màu?
trichoplax

Vâng, đó là những gì tôi muốn nói
bartosz.baczek

Bạn cũng muốn lấy màu sắc làm đầu vào riêng biệt, hay bạn chỉ muốn một màu sắc tùy ý có thể rẻ để thực hiện?
trichoplax

Xin lỗi, tôi nghĩ tôi không hiểu câu hỏi của bạn. Bạn có thể giải thích điều đó nhiều hơn?
bartosz.baczek

Nếu câu trả lời của Kostas Anagnostou là những gì bạn muốn thì hãy bỏ qua ý kiến ​​của tôi. Tôi chỉ hỏi liệu bạn muốn điều đó hay một màu mã hóa.
trichoplax

Câu trả lời:


6

Mở rộng câu trả lời của Kostas Anagnostou, một công thức thường được sử dụng cho giải thích là

float value = 0.3 * InputR + 0.59 * InputG + 0.11 * InputB;

Điều này cho thấy thực tế là các màu sắc khác nhau được một người quan sát cảm nhận với cường độ khác nhau.

Tiếp theo ví dụ, sau đó bạn sẽ xác định một số màu sắc được nhân với giá trị không bão hòa. Ngoài ra, bạn có thể trộn hình ảnh được tô màu với ảnh gốc để có được hiệu ứng ít quyết liệt hơn. Trong trường hợp này, chúng tôi trộn 80% hình ảnh không bão hòa được pha màu (1.0, 0.2, 0.2) với 20% ảnh gốc:

float3 tint = float3(1.0, 0.2, 0.2);
float tintMix = 0.8;
OutputR = tintMix * value * tint.r + (1.0 - tintMix) * InputR;
OutputG = tintMix * value * tint.g + (1.0 - tintMix) * InputG;
OutputB = tintMix * value * tint.b + (1.0 - tintMix) * InputB;

1
Lưu ý rằng (0,3, 0,59, 0,11) là các hệ số luma cho Rec. 601 (còn gọi là Tiêu chuẩn Def. NTSC), trong khi Rec. 709 (còn gọi là High Def. ATSC) sẽ là (0.2126, 0.7152, 0.0722). Và hình ảnh sRGB (có khả năng là những gì bạn đang xử lý) gần với Rec. 709 so với Rec. 601.
dùng1118321

13

(XYZ) có thể là màu RGB mà bạn muốn tô màu cho cảnh của mình. Đối với cảnh trên, nó có thể là màu đỏ (1.0, 0.0, 0.0) hoặc tương tự với thành phần màu đỏ mạnh.

Hãy nhớ rằng vì bạn đang áp dụng màu theo cách nhân, nó sẽ hoạt động như một bộ lọc triệt tiêu các thành phần màu gốc. Vì vậy, nếu cảnh của bạn chủ yếu là màu xanh lá cây nhưng bạn áp dụng (tức là nhân nó với) một bộ lọc màu đỏ (1,0,0) cảnh kết quả sẽ rất tối.

Một mẹo mà bạn có khả năng có thể làm trong những trường hợp như vậy là làm bão hòa cảnh ban đầu và sau đó nhân nó với màu sắc. Bằng cách đó, bạn sẽ giữ được cường độ hình ảnh tổng thể và đạt được màu sắc bạn yêu cầu.

Ví dụ: đây là hình ảnh được nhân với (1, 0, 0), (1, 0,2, 0,2) và (1, 0,5, 0,5) từ trái sang phải:

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Ngoài ra, bạn có thể muốn tô màu thứ gì đó không phải là màu một kênh thuần túy 100%.
joojaa

3
Tôi đã tiếp tục và thêm một số hình ảnh ví dụ vào bài đăng - hy vọng bạn không phiền!
Nathan Reed

Đó chính xác là những gì tôi muốn nói. Cảm ơn nỗ lực và ví dụ :)
bartosz.baczek

3

Chọn màu RGB của kính đầy màu sắc của bạn và chọn độ trong suốt của chúng bằng cách chọn giá trị alpha A. Sau đó, alpha kết hợp kính trên đầu hình ảnh đầu vào:

OutputR = R * A + InputR * (1-A)
OutputG = G * A + InputG * (1-A)
OutputB = B * A + InputB * (1-A)

Bạn có ý nghĩa gì bởi "tổng hợp"? Có một số phép toán cho phép tôi kết hợp hai màu?
bartosz.baczek

Đó là những gì các phương trình ví dụ trong bài viết của mình làm.
yuriks

2
Tôi không nghĩ đây là những gì anh ấy muốn. Nếu bạn đeo kính màu đỏ, bạn sẽ thấy các bước sóng màu đỏ ở mức độ cơ bản đầy đủ và rất ít từ các bước sóng khác. Đó không phải là một kết hợp tuyệt vời cho tổng hợp alpha.
John Calsbeek
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.