Đối với toán shader, tại sao RGB tuyến tính phải giữ gam của sRGB?


13

sRGB thường tương phản với "RGB tuyến tính."

  • Hình ảnh được lưu trữ trên đĩa và được chuyển đến hiển thị ở sRGB, có cường độ xấp xỉ về mặt cảm nhận.
  • Toán Shader được thực hiện trong RGB tuyến tính, đồng nhất về mặt vật lý về cường độ.
  • Điều chỉnh gamma có thể được áp dụng để chuyển đổi giữa hai.

Bây giờ, sRGB có một tiêu chuẩn xác định rõ ràng về gam màu của nó, nói chính xác vị trí của màu đỏ, xanh lá cây, xanh dương và trắng tinh khiết. Nhưng không có tiêu chuẩn tương ứng cho "RGB tuyến tính". Bất kỳ tam giác nào trên biểu đồ sắc độ đều có thể được gọi là tuyến tính, và, thực sự, có một số gam màu nổi tiếng để lựa chọn:

Giao diện RGB

Trong thực tế, khi chúng ta nói "RGB tuyến tính", chúng tôi có nghĩa là "sRGB mà không cần hiệu chỉnh gamma". (Đây hoàn toàn là những gì chúng tôi đang làm khi chúng tôi áp dụng hiệu chỉnh gamma sRGB như một bước xử lý hậu kỳ cuối cùng mà bỏ qua các không gian màu cho phần còn lại của đường dẫn kết xuất.)

Nhưng tại sao gam màu RGB đó lạicái chính xác được sử dụng để tính toán nội suy và chiếu sáng? Có vẻ độc đoán. Nếu có bất cứ điều gì, chúng ta sẽ không muốn sử dụng gam lớn nhất có thể để tính toán nội bộ, sau đó cắt hoặc chia tỷ lệ màu cho gam của thiết bị đầu ra ở cuối?

Có phải là ánh sáng RGB sẽ gần đúng không có vấn đề gì, vì vậy chúng ta không chọn loại gam nào, và chúng ta cũng có thể chọn cái gần nhất với những gì màn hình hỗ trợ? Có phải chỉ là sơ suất? Hay bằng cách tính toán trong các gam khác nhau này thực sự mang lại kết quả chính xác như nhau, bằng cách nào đó?

Câu trả lời:


13

Nói về tuyến tính RGB phải được tránh bởi vì nó không cho bạn biết bất cứ điều gì về nội tại không gian màu RGB, tức là, Hàm gốc, Hàm trắng và Hàm chuyển thành phần màu. Một vài năm trước, giả sử đó là sRGB đã bị trung gian nhưng ngày nay với DCI-P3 và BT.2020 rất phổ biến, nó phải được loại trừ.

Gam màu lý tưởng để kết xuất là một gam sẽ giảm thiểu các lỗi liên quan đến tham chiếu trong thế giới thực hoặc thuận tiện hơn là kết xuất quang phổ chân thực mặt đất. Điểm nổi bật đầu tiên của câu này là các dải màu RGB khác nhau không tương đương và sẽ không tạo ra kết quả tương tự.

Mọi người có thể nghĩ rằng thực hiện hai kết xuất với cùng màu cơ bản nhưng một trong đó chúng được mã hóa bằng sRGB / BT.709 và một cái khác được mã hóa bằng DCI-P3 và sau đó chuyển đổi hai hình ảnh kết quả thành ví dụ ACES2065-1 sẽ mang lại những hình ảnh tương tự nhưng nó không phải là trường hợp. Một số phép toán vì bản chất của đại số tuyến tính và ma trận phụ thuộc vào các nguyên hàm không gian màu RGB đã cho, tức là, trên cơ sở colourspaces. Các hoạt động tương tự được thực hiện trong không gian màu RGB khác nhau sẽ mang lại các giá trị tristimulus khác nhau khi được chuyển đổi trở lại không gian màu CIE XYZ. Ví dụ: phép nhân, phép chia và phép toán phụ thuộc vào các số nguyên phân không gian RGB trong khi phép cộng và phép trừ thì không.

RGB Colourspaces và lũy thừa

Hình ảnh này minh họa hiệu ứng của việc nhân các màu khác nhau thành các vùng màu RGB khác nhau: màu kết quả là khác nhau. Các mẫu khác nhau được tạo như sau: 3 giá trị không gian sRGB ngẫu nhiên được chọn và chuyển đổi thành ba vùng màu RGB được nghiên cứu, chúng được lũy thừa, được chuyển đổi trở lại thành không gian sRGB, được vẽ trong Biểu đồ màu sắc CIE 1931 ở bên trái và được hiển thị dưới dạng các mẫu màu đúng.

Các thử nghiệm và nghiên cứu được thực hiện bởi Ward và Eydelberg-Vileshin (2002) , Langlands và Mansencal (2014)Mansencal (2014) đã chỉ ra rằng các gam màu với các nguyên tố gần nhất với locus phổ, tức là các nguyên thủy sắc nét phổ, có xu hướng giảm thiểu các lỗi so với mặt đất phổ sự thật tái hiện.

Đây là một hình ảnh gần đây tôi đã kết xuất với Mitsuba để xác nhận lại những phát hiện của chúng tôi với Anders:

Kết xuất Colourspaces

Đó là các biểu hiện của cùng một cảnh sử dụng các nguyên tắc BT.709 (hàng đầu tiên), 47 thùng quang phổ (hàng thứ hai), các nguyên tắc BT.2020 (hàng thứ ba), các phổ gốc BT.709 hiển thị các phần dư (hàng thứ tư), trừ phổ BT .2020 nguyên thủy biểu hiện phần dư (hàng thứ năm). Hàng cuối cùng hiển thị hình ảnh tổng hợp được lắp ráp với ba sọc dọc tương ứng với các bầu cử sơ bộ BT.709, quang phổ và, BT.2020. Chiếu sáng trực tiếp có xu hướng phù hợp giữa các render. Các khu vực cho thấy hiệu ứng của nhiều ánh sáng bị dội lại, ví dụ như trần nhà, trong các nguyên thủy BT.709 và BT.2020 có xu hướng biểu hiện sự bão hòa tăng lên, đặc biệt là trong các nguyên thủy BT.709 làm cho mất hoặc mất năng lượng, đặc biệt là trong BT .2020 kết xuất. Không bao gồm các ngoại lệ, ví dụ, nguồn sáng khả kiến, RMSE với kết xuất quang phổ là 0,00830,0116 tương ứng với các bầu cử sơ bộ BT.2020 và các bầu cử sơ bộ BT.709.

Bây giờ không có nghĩa là họ sẽ luôn hoạt động tốt hơn và người ta có thể tạo ra các ví dụ sẽ thể hiện sự thiên vị đối với BT.709 / sRGB. Điểm nổi bật chính là các kết xuất RGB không thể phù hợp với các kết xuất quang phổ và các gam màu rộng có xu hướng hoạt động tốt hơn. Đối với việc chọn một không gian hiển thị, tôi sẽ chọn một không gian rộng bao gồm Gamut và DCI-P3, BT.2020 hoặc ACEScg của Pulum là những ứng cử viên tuyệt vời cho điều đó.


5

Trong thực tế, khi chúng ta nói "RGB tuyến tính", chúng tôi có nghĩa là "sRGB mà không cần hiệu chỉnh gamma".

Sẽ đúng hơn khi nói rằng có "không gian màu sRGB" và "không gian màu sRGB được tuyến tính hóa", với đặc tả sRGB định nghĩa chuyển đổi từ cái này sang cái khác.

Có, có vô số không gian màu "RGB tuyến tính". Nhưng điều mà tất cả các không gian màu "RGB tuyến tính" này có điểm chung là chúng là tuyến tính . Điều này có nghĩa là, nếu bạn nhân đôi giá trị của bất kỳ thành phần nào, bạn sẽ nhân đôi cường độ ánh sáng mà thành phần đó thể hiện. Đó thực chất là những gì nó có nghĩa là "tuyến tính": có một ánh xạ tuyến tính giữa các giá trị màu sắc và cường độ kết quả của màu ánh sáng đó.

Điều này rất quan trọng vì các phương trình chiếu sáng không hoạt động nếu các giá trị màu không ánh xạ tuyến tính theo cường độ ánh sáng. Nhưng các phương trình không quan tâm tuyến tính vùng màu bạn sử dụng; bạn chỉ cần chọn một.

Vì vậy, không gian màu sRGB được tuyến tính hóa không chính xác hơn không gian màu Adobe RGB được tuyến tính hóa hoặc không gian màu SWOP CMYK được tuyến tính hóa. Vấn đề chính xác là hai điều:

  1. Không gian màu đại diện cho ánh xạ tuyến tính của các giá trị theo cường độ ánh sáng.
  2. Không gian màu được chọn luôn được sử dụng trong phương trình chiếu sáng. Đó là, tất cả các màu được sử dụng trong phương trình chiếu sáng đến từ cùng một không gian màu (tuyến tính).

Có phải là ánh sáng RGB sẽ gần đúng không có vấn đề gì, vì vậy chúng ta không chọn loại gam nào, và chúng ta cũng có thể chọn cái gần nhất với những gì màn hình hỗ trợ?

Điều đó, và thực tế là chuyển đổi sRGB được tích hợp vào phần cứng ngày nay, trong khi chuyển đổi không gian màu khác thường xuyên thì không. Vì vậy, nếu bạn muốn sử dụng không gian màu Adobe RGB được tuyến tính hóa, bạn phải thực hiện rất nhiều công việc trong trình tạo bóng của mình để tuyến tính hóa các giá trị texel và thực hiện phép nội suy song tuyến tính trên chúng (cần phải được thực hiện sau khi tuyến tính hóa) trước khi bạn có thể áp dụng chúng đến phương trình chiếu sáng. Và sau đó, bạn phải thực hiện chuyển đổi từ Adobe RGB được tuyến tính hóa sang sRGB được tuyến tính hóa, để bạn có thể ghi vào hình ảnh bộ đệm khung sRGB để hiển thị.

Hoặc bạn chỉ có thể sử dụng sRGB được tuyến tính hóa ở mọi nơi và có hiệu suất. Cái sau có xu hướng thắng.


Bạn nghĩ gì về bài viết này ? Nếu tôi đọc đúng, nó chứng tỏ rằng các phép tính trong các không gian màu tuyến tính khác nhau sẽ dẫn đến các kết quả khác nhau.
Tối đa

@Maxpm: Thật thú vị. Tôi đọc được bài báo đó là vấn đề làm sáng tỏ thực tế là ánh sáng không thực sự phù hợp với mô hình không gian màu RGB của chúng tôi. Điều này gây ra kết quả hình ảnh khác nhau trong những gì phải về mặt toán học là điều tương tự. Ở đó, giải pháp duy nhất dường như là ngừng sử dụng RGB và bắt đầu sử dụng kết xuất quang phổ.
Nicol Bolas

@Maxpm nhưng tất nhiên họ làm sau khi tất cả các không gian khác là khác nhau. Nhưng sau đó RGB không có màu nên có điều đó. Nhưng sau đó có câu hỏi ho đúng không? Lợi nhuận trở nên nhỏ hơn và nhỏ hơn,
joojaa

0

Có hai mặt tại sao sRGB đặc biệt. Đối với hình ảnh không phải là HDR đầu vào, người ta cho rằng những hình ảnh đó nên được giả định là được nén thành sRGB (cho dù tuyên bố này là chính xác là một câu chuyện khác). Do đó, trước khi bạn có thể thực hiện bất kỳ thao tác toán tuyến tính nào trên chúng, bạn cần giải nén chúng khỏi sRGB. Cũng có thể một hình ảnh đã được chụp và nén vào một đại diện khác không phải là sRGB, trong trường hợp đó bạn cần giải nén biểu diễn cụ thể đó. Trong mọi trường hợp, mã hóa ngụ ý một gam nhất định mà hình ảnh đầu vào sẽ không bao giờ thoát ra (vì hình ảnh được lưu trữ sRGB thường bị cắt ngắn thành 8 bit trên mỗi kênh), nhưng toán học shader của bạn không phải ở lại gam màu đó sau đầu vào hình ảnh được giải nén. Nhưng cuối cùng bạn phải xem xét màn hình.

Nếu bạn có một hình ảnh và đã đến lúc hiển thị nó, bạn mã hóa nó trong một đại diện mà thiết bị hiển thị yêu cầu. CRT đã chọn sRGB, sau đó LCD mô phỏng điều đó, do đó, nén sRGB cho màn hình hiển thị là lựa chọn phổ biến trong những thập kỷ qua và điều đó đã hạn chế đầu ra dính vào gam sRGB, nếu không sẽ xảy ra hiện tượng cắt. Màn hình phạm vi rộng hơn không phải dính vào gam chính xác đó.

(Tôi nghĩ rằng cơ sở cho tuyên bố rằng hình ảnh do con người tạo ra được mã hóa sRGB là bởi vì những hình ảnh đó được cho là đã được tác giả trên màn hình sRGB)

Vì vậy, bây giờ bạn có thể có thể thấy rõ hơn lý do tại sao sRGB nói riêng được hỗ trợ trong phần cứng cho đầu vào toán học shader và hiển thị hình ảnh. Đây là trường hợp phổ biến. Thêm vào đó, nó có giá trị tốt trong việc giảm các tạo tác dải màu nhận thức, vì vậy đây là một cách tốt để nén màu trong 8 bit và giữ cho chúng trông hợp lý với con người.


0

Nếu bạn cho phép các giá trị nằm ngoài phạm vi 0..1, thì ngay cả với các nguyên tắc khá hạn chế của sRGB, bạn vẫn có thể xử lý toàn bộ gam màu thị giác của con người. Vì vậy, để lưu trữ các giá trị màu ánh sáng dấu phẩy động, bạn không nên sử dụng quá nhiều nguyên tắc ban đầu. Tuy nhiên, thực hiện bất kỳ loại toán nhân nào cũng có một chút thú vị, vì tọa độ tùy ý của các nguyên thủy đóng vai trò là "trục xoay". Các nguyên tắc sRGB thường được sử dụng vì theo truyền thống, dữ liệu đầu vào của bạn được mã hóa sRGB và hiển thị đầu ra là sRGB hoặc rec709 ... Với rec2020, một nửa số đó đã thay đổi, nhưng hiện tại, hầu hết dữ liệu đầu vào của bạn vẫn có thể được mã hóa sRGB, vì vậy sử dụng các nguyên tắc tương tự như lưu trữ của bạn chỉ là lựa chọn dễ dàng nhất.

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.