HDR hoạt động như thế nào?


17

Tôi đang cố gắng hiểu HDR là gì và nó hoạt động như thế nào.

Tôi hiểu các khái niệm cơ bản và có một ý tưởng nhỏ về cách nó được thực hiện với D3D / hlsl.

Tuy nhiên, trời vẫn còn khá nhiều sương mù.

Giả sử tôi đang vẽ một quả cầu có kết cấu trái đất và một danh sách các đỉnh nhỏ để hoạt động như những ngôi sao, làm thế nào để tôi biểu hiện điều này trong HDR?

Dưới đây là một vài điều tôi bối rối:

  • Tôi đoán, tôi không thể sử dụng bất kỳ định dạng hình ảnh cơ bản nào cho kết cấu vì các giá trị sẽ bị giới hạn ở [0, 255] và được kẹp vào [0, 1] trong một shader. Tương tự với bộ đệm phía sau, tôi lấy nó định dạng cần phải là định dạng dấu phẩy động?

  • Các bước khác liên quan là gì? Chắc chắn phải có nhiều hơn là chỉ sử dụng các định dạng dấu phẩy động để kết xuất với mục tiêu kết xuất và sau đó áp dụng một số nở hoa như một quá trình đăng bài? (xem xét đầu ra sẽ là 8bpp nào)

Về cơ bản, các bước cho HDR là gì? Làm thế nào nó hoạt động ? Tôi dường như không thể tìm thấy bất kỳ bài báo / bài viết hay nào mô tả quá trình, ngoài bài viết này , nhưng nó dường như lướt qua những điều cơ bản một chút, vì vậy nó gây nhầm lẫn.

Câu trả lời:


19

Kỹ thuật HDR cho phép bạn mô phỏng một phạm vi chi tiết lớn hơn bạn có thể xem trên màn hình so với ánh sáng / kết cấu truyền thống. Bạn có thể so sánh nó với cách mắt hoạt động khi tiếp xúc với các lượng ánh sáng khác nhau - khi có quá nhiều ánh sáng, mắt cho phép ít ánh sáng hơn để mọi thứ vẫn nằm trong phạm vi nhìn thấy của bạn. Khi không có đủ ánh sáng, mống mắt sẽ mở ra nhiều hơn để có thể nhìn thấy nhiều chi tiết hơn.

bit-tech.net so sánh HDR

Phía bên tay phải của hình ảnh này là sử dụng HDR. Nó sử dụng nhiều hơn các dải màu, bóng tối tối hơn và vùng sáng hơn sáng hơn. Trong so sánh, phía bên trái của hình ảnh trông hơi phẳng.

Các bước cơ bản là:

  1. Kết xuất cảnh của bạn thành kết cấu điểm nổi (với định dạng như A16B16G16R16F) bằng các kết cấu điểm nổi khác trên các mô hình của bạn và / hoặc đèn có thể có độ sáng lớn hơn 1.0f.

  2. Để hiển thị kết cấu này, dải màu có thể nhìn thấy cần phải được chuyển đổi thành thứ có thể hiển thị trên màn hình của bạn - quá trình này được gọi là ánh xạ giai điệu và có thể sử dụng nhiều phương trình ánh xạ tông màu khác nhau để có được các hiệu ứng khác nhau. Đây là điều bắt buộc vì màn hình không thể hiển thị đầy đủ các màu hoặc độ phát quang mà chúng ta có thể lưu trữ trong kết cấu dấu phẩy động (sẽ rất tuyệt nếu có thể, nhưng nó cũng sẽ là một mối nguy chói mắt ...).

  3. Bloom và các hiệu ứng khác sau khi được thêm vào để phóng đại hơn nữa sự khác biệt về độ phát quang của những thứ được hiển thị. Sự nở hoa được tính toán từ bộ đệm điểm nổi và kết hợp với hình ảnh ánh xạ giai điệu.

Mong rằng sẽ giúp


Tôi biết đây là một câu hỏi (rất) cũ, nhưng bạn có thể giới thiệu cho tôi một thuật toán ánh xạ giai điệu tốt nhưng đơn giản không?
JSQuareD

6

Về mặt kỹ thuật, HDR chỉ có nghĩa là sử dụng một phạm vi lớn hơn các giá trị có thể cho đồ họa của bạn. Thông thường, bạn bị giới hạn ở 256 giá trị riêng biệt cho các kênh màu đỏ, xanh lục và xanh lam, điều đó có nghĩa là nếu bạn có 2 mục, một lần sáng gấp đôi so với các mục khác và lần thứ 3 sáng hơn 10.000 lần so với lần đầu tiên, thì không bằng cách bạn có thể thể hiện chính xác cả 3 trong cùng một cảnh - bạn có thể làm cho vật sáng chỉ sáng hơn 256 lần so với đầu tiên hoặc thay vào đó, bạn làm cho cả hai vật mờ xỉn hoàn toàn màu đen (mất độ tương phản giữa chúng) và sau đó vật sáng sẽ sáng hơn vô hạn hơn cả hai

Điều này rất dễ khắc phục bằng cách sử dụng các giá trị dấu phẩy động cho các giá trị đỏ / lục / lam - nhưng bây giờ bạn có vấn đề về cách hiển thị trên một thiết bị đồ họa chỉ xử lý một số giá trị rời rạc cố định trên mỗi kênh (ví dụ: 256) . Vì vậy, phần thứ hai của vấn đề là làm thế nào để ánh xạ các giá trị dấu phẩy động của bạn trở lại phạm vi giới hạn. Giải pháp tầm thường là chia tỷ lệ tất cả các giá trị theo tỷ lệ riêng biệt trong phạm vi riêng biệt, nhưng điều này có nghĩa là 1 pixel rất sáng có thể làm cho phần còn lại của màn hình bị đen, v.v. Đôi khi, đây là điều bạn muốn, đôi khi không - hãy xem ánh xạ tông màu của CiscoIPPhone liên kết cho các ví dụ về cách bạn có thể tiếp cận này.

Nói chung, đó không phải là kết cấu của bạn cần được lưu trữ ở định dạng mới - đó là khi ánh sáng được áp dụng cho chúng mà bạn cần để có thể chứa các giá trị lớn hơn. Rõ ràng tuy nhiên nếu bạn có nguồn sáng nướng thành một kết cấu - ví dụ. một nền đầy sao - bạn có thể muốn một định dạng độ phân giải cao hơn ở đó. Hoặc chỉ cần shader mở rộng các giá trị của các vật liệu đó lên khi đến lúc kết xuất chúng.


5

Theo truyền thống, máy tính đại diện cho mỗi pixel trên màn hình chỉ có 24 bit trong bộ nhớ: 8 cho màu đỏ, 8 cho màu xanh lá cây và 8 cho màu xanh lam. Đây là gần như đủ bit mà con người sẽ không nhận thấy nếu bạn thêm nhiều hơn và byte 8 bit rất thuận tiện cho bộ vi xử lý, vì vậy đó là những gì bị mắc kẹt.

Trong khi 8 bit là gần như đủ chính xác để hiển thị một hình ảnh, nhưng nó chắc chắn không đủ độ chính xác để tính toán một hình ảnh. Tại các điểm khác nhau trong khi tính toán một hình ảnh, cần ít nhất 32 bit độ chính xác.

Đây là lý do tại sao các pixel shader tính toán màu sắc với độ chính xác 32 bit, ngay cả khi bạn đang kết xuất thành hình ảnh chính xác 8 bit. Mặt khác, ví dụ, bạn không thể chia một giá trị cho 1000, và sau đó nhân nó với 1000, bởi vì chia bất kỳ giá trị 8 bit nào cho 1000 kết quả bằng 0.

Đã có một xu hướng trong đồ họa 3D thời gian thực hướng đến việc giữ tất cả đồ họa ở độ chính xác> 8 bit cho đến thời điểm cuối cùng có thể, tại thời điểm đó> 8 bit màu đỏ được ghép xuống 8 bit, và tiếp theo là màu xanh lục và xanh lam.

HDR đề cập đến hành động kết xuất thành hình ảnh có độ chính xác cao hơn 8 bit. Trong các trò chơi video truyền hình đương đại, độ chính xác 16 bit là tiêu chuẩn và điều này có thể là "đủ" trong các trò chơi video trong nhiều năm tới.


2

Một khía cạnh mà tôi nghĩ là chìa khóa cho HDR là ứng dụng chính xác của gamma màn hình.

Màn hình bạn đang xem tạo ra ánh sáng như một chức năng của các pixel đầu vào. Bạn có thể mong đợi rằng một pixel có giá trị 255 sẽ tạo ra ánh sáng (xấp xỉ) gấp 255 lần so với pixel có giá trị 1. Đây không phải là trường hợp. Với gamma màn hình tiêu chuẩn là 2,3, nó sáng hơn 255 ^ 2,3 lần, tương đương khoảng 340000!

Mọi người sản xuất nội dung (máy phát biểu máy ảnh) đều biết điều này hoặc (nếu bạn là nhà thiết kế), bạn hoàn toàn bù đắp cho nội dung đó.

Điều này hoàn toàn tốt nếu bạn chỉ hiển thị ảnh bitmap (tốt, hầu hết thời gian), nhưng nếu bạn sử dụng chúng làm kết cấu trong cảnh 3D thì đó là một câu chuyện khác. Nếu bạn muốn mô hình tương tác với ánh sáng một cách chính xác, bạn nên sử dụng các tính toán ánh sáng tuyến tính trong suốt đường ống kết xuất. Điều này có nghĩa là

  • sửa kết cấu của bạn cho gamma

  • kết xuất mọi thứ bằng ánh sáng tuyến tính (nơi bạn cần rất nhiều độ chính xác do Dải ánh sáng động cao),

  • áp dụng biến đổi gamma nghịch đảo của màn hình như là điều cuối cùng trước khi bạn đưa hình ảnh lên màn hình.

Khi bạn thực hiện thay đổi này cho một cảnh hiện có, với tác phẩm nghệ thuật, ánh sáng, v.v., bạn có thể phải sửa rất nhiều cường độ ánh sáng và kết cấu, bởi vì chúng được chọn để trông đẹp khi hiển thị với ánh sáng phi tuyến tính. Vì vậy, nó không phải là một tính năng bạn chỉ có thể "bật" và mong muốn mọi thứ sẽ tốt hơn như thế.


2
Gamma chắc chắn rất quan trọng và là chìa khóa để có được kết xuất dựa trên vật lý, nhưng không trực tiếp liên quan đến HDR, IMO.
Nathan Reed
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.