Liệu thành phần suy giảm tuyến tính trong các mô hình chiếu sáng có một đối tác vật lý?


18

Trong OpenGL (và các hệ thống khác) khoảng cách hệ số suy giảm cho đèn Vấn đề là cái gì đó như 1/(c+kd+sd^2), nơi dlà khoảng cách từ ánh sáng và c, kslà hằng số.

Tôi hiểu sd^2thành phần mô hình suy giảm "luật bình phương nghịch đảo" chính xác được biết đến trong thực tế.

Tôi đoán hằng số c, thường là một, có để đối phó với các giá trị rất nhỏ của d(và có lẽ là phòng thủ chia cho không?).

kdThành phần tuyến tính có vai trò gì trong mô hình, (theo mặc định klà 0 trong OpenGL). Khi nào bạn sẽ sử dụng các giá trị khác cho k? Tôi biết rằng đây được gọi là thành phần "suy giảm tuyến tính", nhưng nó mô phỏng hành vi nào trong mô hình chiếu sáng? Nó dường như không xuất hiện trong bất kỳ mô hình vật lý nào của ánh sáng mà tôi biết.

[CHỈNH SỬA]

David Gouveia đã chỉ ra rằng yếu tố tuyến tính có thể được sử dụng để giúp cảnh 'nhìn' gần hơn với những gì nhà phát triển / nghệ sĩ dự định hoặc để kiểm soát tốt hơn tốc độ ánh sáng rơi ra. Trong trường hợp câu hỏi của tôi trở thành "yếu tố suy giảm tuyến tính có đối tác vật lý hay nó chỉ được sử dụng như một yếu tố mờ nhạt để giúp kiểm soát chất lượng ánh sáng trong cảnh?"


Tôi không nói rằng sự suy giảm tuyến tính làm cho một cảnh trông đẹp hơn hoặc thực tế hơn. Những gì tôi nói là nó có thể trông tốt hơn cho mục đích của bạn . Raytracer của tôi chiếu sáng một cảnh rất nhỏ và khi so sánh cả hai mô hình, tuyến tính trông tốt hơn. Tôi không cần một lý do vật lý để nói rằng nó trông đẹp hơn - nó chỉ nhìn gần hơn với hiệu quả mà tôi muốn đạt được. Ngược lại, không phải là luật bình phương nghịch đảo trông không thực tế, nó chỉ rơi ra quá nhanh và đóng góp ít hơn vào việc chiếu sáng cảnh hơn những gì tôi cần.
David Gouveia

Xin lỗi David, tôi không có ý nói sai câu trả lời của bạn. Tôi đã thay đổi chỉnh sửa của tôi ở trên.
Ken

1
Luôn luôn tốt để nhớ rằng tất cả ánh sáng là một hack, tinh khiết và đơn giản =)
Patrick Hughes

Câu trả lời:


21

Ánh sáng, từ các nguồn giống như điểm, rơi xuống với hình vuông của khoảng cách. Đó là thực tế vật lý.

Suy giảm tuyến tính thường được tuyên bố là xuất hiện vượt trội. Nhưng điều này chỉ đúng khi làm việc trong không gian màu phi tuyến tính . Đó là, nếu bạn không có hoạt động hiệu chỉnh gamma thích hợp. Lý do khá đơn giản.

Nếu bạn đang viết các giá trị RGB tuyến tính thành màn hình phi tuyến tính mà không cần hiệu chỉnh gamma, thì các giá trị tuyến tính của bạn sẽ được xử lý bằng đoạn đường nối gamma tích hợp của màn hình. Điều này làm tối hiệu quả cảnh so với những gì bạn thực sự dự định.

Giả sử gamma là 2.2, màn hình của bạn sẽ nâng hiệu quả tất cả các màu lên sức mạnh của 2.2 khi hiển thị chúng.

Đây là suy giảm tuyến tính : 1/kd. Đây là sự suy giảm tuyến tính với đoạn đường nối gamma của màn hình được áp dụng : 1/(kd)^2.2. Điều đó khá gần với một mối quan hệ bình phương nghịch đảo thích hợp.

Nhưng bình phương nghịch đảo thực tế: 1/sd^2trở thành : 1/((s^2)(d^4.4)). Điều này làm cho suy giảm ánh sáng rơi ra nhiều hơn mạnh hơn dự kiến.

Nói chung, nếu bạn đang sử dụng hiệu chỉnh gamma thích hợp (như kết xuất với bộ đệm khung sRGB), bạn không nên sử dụng suy giảm tuyến tính. Nó sẽ không nhìn đúng. Ở tất cả . Và nếu bạn không sử dụng hiệu chỉnh gamma ... có gì không ổn với bạn;)

Trong mọi trường hợp, nếu bạn đang cố gắng bắt chước thực tế, bạn muốn bình phương nghịch đảo (và gamma chính xác). Nếu bạn không, thì bạn có thể làm bất cứ điều gì bạn cần cho cảnh của mình.


4
+1 Tôi đã biết về kết xuất chính xác gamma trong một thời gian. Tôi đã biết về suy giảm bậc hai và tuyến tính trong một thời gian. Và đây là khoảnh khắc đầu tiên tôi nhận ra mối liên hệ giữa hai người. :-)
David Gouveia

Bất kỳ lý do cho -1?
Nicol Bolas

9

Linh hoạt .

Bởi vì bạn có thể muốn đèn của bạn rơi tuyến tính. Nó ở đó để cung cấp cho bạn mức độ kiểm soát. Nó không thực sự cần phải chính xác về mặt vật lý (và toàn bộ các phương trình chiếu sáng bóng chắc chắn cũng không chính xác về mặt vật lý).

Đôi khi, mô hình bậc hai sẽ phát ra ánh sáng quá nhanh gần nguồn và để lại "ánh sáng trắng" ở các bề mặt gần đó. Bằng cách cung cấp một hệ số tuyến tính và không đổi, bạn có thể linh hoạt điều chỉnh kết quả theo ý thích của mình

Ví dụ, khi tôi thực hiện một raytracer, tôi phát hiện ra rằng luật bình phương nghịch đảo làm cho đèn điểm của tôi rơi quá nhanh. Tôi đã thay đổi thành một mô hình tuyến tính kẹp (trong đó mỗi ánh sáng có bán kính tối thiểu và tối đa, với phép nội suy tuyến tính ở giữa) và nó trông đẹp hơn.

Chỉnh sửa: Chỉ cần tìm thấy một tài nguyên tốt đẹp giải thích điều này .


6

Được rồi, tôi sẽ đoán nó.

Quan sát sơ bộ

Trong OpenGL (và các hệ thống khác) khoảng cách hệ số suy giảm cho đèn Vấn đề là cái gì đó như 1/(c+kd+sd^2), nơi dlà khoảng cách từ ánh sáng và c, kslà hằng số.

Tôi hiểu sd^2thành phần mô hình suy giảm "luật bình phương nghịch đảo" chính xác được biết đến trong thực tế.

Đường cong cho c+kd+sd^2là một parabola, và đường cong cho sd^2; sự khác biệt không quan trọng như vẻ ngoài của chúng: chúng cư xử tương tự nhau ở vô cực, nó chỉ dành cho những giá trị nhỏ mà chúng khác nhau. kcó nghĩa là gì , nó chỉ có ý nghĩa khi gần với ánh sáng.

Đơn giản hóa sơ bộ

Vì đây là một yếu tố suy giảm, bạn cũng có thể thiết lập s == 1hoặc chia từng hằng số theo sbiểu thức và chia công suất của nguồn sáng của bạn cho s. Có một tham số quá nhiều trong công thức.

Bạn kết thúc với:

1/(c/s+(k/s)d+d^2)

Thay đổi biến

Sòng bạc hoàn toàn tương đương với:

1/(A + D^2)

với A == c/s - k^2/(4s^2)và, quan trọng hơn , D == d + k/2s.

Điều này 1/(A+D^2)thực sự trông giống như bình thường 1/(c+d^2), phải không?

Phần kết luận

Các kyếu tố tiến bộ hoặc trì hoãn việc suy giảm ánh sáng để nó chỉ bắt đầu ở bán kính-k/2s (có, nó cũng có thể có "tiêu cực" bán kính, suy nghĩ của một ánh sáng điểm tưởng tượng bên trong một gương cầu tưởng tượng rằng sẽ chỉ cho phép ánh sáng ra lần thứ hai) . Có vẻ như toán học chiến thắng một lần nữa!

Chỉnh sửa: Trong một giây, tôi nghĩ nó tương đương với ánh sáng hình cầu, nhưng thực tế không phải vậy. Đáng chú ý nhất, nó sẽ không tạo ra bóng mềm.

Hữu ích?

Tôi đoán là thông số này có thể được sử dụng bởi một nghệ sĩ để làm cho ánh sáng xuất hiện giống như nó ở gần (hoặc xa hơn) với vật thể trong điều kiện chiếu sáng, nhưng không di chuyển nó. Vì đèn điểm tạo ra bóng cứng, nên có thể yêu cầu ánh sáng vẫn ở một vị trí cụ thể.


3

Hệ số suy giảm tuyến tính là đối tác vật lý của ánh sáng truyền vào môi trường. Không suy giảm, ánh sáng dường như đi trong khoảng trống hoàn hảo. Khi hiển thị các cảnh "thực tế", bạn muốn không khí giảm cường độ ánh sáng theo khoảng cách và sự suy giảm này là tuyến tính.


Tôi không nghĩ đó có thể là sự thật. Ánh sáng truyền qua một môi trường sẽ được suy yếu bởi 1/dtrong Rphối hợp, vẫn bằng 1/d^2trong thetaphihình cầu tọa độ. Do đó, những gì bạn mô tả là 1/d^3sự suy giảm cường độ ánh sáng.
sam hocevar

3

Yếu tố suy giảm tuyến tính là có cho các trường hợp bạn có thể muốn sử dụng suy giảm tuyến tính cho ánh sáng của mình, nhưng điều quan trọng là - bạn không phải sử dụng nó (hoặc bất kỳ yếu tố suy giảm nào khác, cho vấn đề đó).

Điều này cho phép bạn điều chỉnh ánh sáng theo sở thích cá nhân của riêng bạn. Vì vậy, chỉ cần đặt bất kỳ yếu tố suy giảm nào bạn không muốn thành 0 và các yếu tố bạn muốn không khác 0 và đã xong.

Một ví dụ cụ thể mà bạn có thể muốn sử dụng suy giảm tuyến tính sẽ là nếu bình phương nghịch đảo chính xác hơn về mặt toán học cung cấp quá nhanh. Sử dụng tuyến tính, bạn có thể nhận được một kết quả có thể trông đủ tốt hoặc ít hơn (và có ít ánh sáng hơn trong cảnh); vì vậy bạn sẽ sử dụng 0 hằng số, 1 tuyến tính và 0 hàm mũ.

Thật thú vị khi lưu ý (nhưng phải thừa nhận là không liên quan đến cuộc thảo luận này) rằng các điểm phát sinh trong cả OpenGL và D3D (và các tham số điểm trong OpenGL) sử dụng cùng một công thức suy giảm.

Cũng đáng lưu ý rằng ánh sáng OpenGL / D3D không hoàn toàn có ý định chính xác về mặt vật lý; nó không bao giờ được thiết kế để trở thành bất cứ thứ gì ngoài một xấp xỉ có thể chấp nhận được và điều đó nên được lưu ý khi truy vấn bất cứ điều gì liên quan đến cách thức hoạt động của nó.

Tất nhiên, ngày nay rất có thể bạn sẽ sử dụng một shader vì vậy công thức ánh sáng cũ chủ yếu chỉ mang tính lợi ích học thuật / lịch sử - bạn có thể viết bất kỳ công thức ánh sáng nào bạn muốn.


1
  • c là giá trị suy giảm không đổi cho nguồn sáng.
  • llà suy hao tuyến tính. Đó là lý do tại sao nó được nhân lên bởi nguồn sáng cho nguồn sáng.
  • s là độ suy giảm bậc hai, do đó, nó nhân với bình phương của khoảng cách.

Có một số thông tin trong liên kết này .


Cảm ơn, nhưng câu hỏi của tôi là vai trò của thành phần suy giảm tuyến tính trong ánh sáng mô hình là gì. Tôi hỏi bởi vì nó không xuất hiện trong bất kỳ mô hình vật lý nào của ánh sáng mà tôi biết. Liên kết bạn cung cấp KHÔNG giải thích thành phần suy giảm tuyến tính là gì. Nó chỉ nói; "Đây là suy giảm tuyến tính", mà không có bất kỳ lời giải thích nào khác.
Ken

Được rồi, tôi giải thích sai câu hỏi của bạn. Sự suy giảm tuyến tính sẽ được quan sát tốt hơn trong một nguồn sáng vô hạn, một chiều (nghĩ là một ống huỳnh quang), trong khi mô hình bậc hai hoạt động của một nguồn sáng hình cầu. Cho đến nay tôi đã tìm thấy chỉ có một nơi mà ở đó là giải thích về sự tương ứng giữa các mô hình ánh sáng vật lý và được sử dụng trong đồ họa máy tính: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo

1

Nó có thể xuất phát từ thực tế là Z, theo lời của Eric Lengyel ,

là phi tuyến vì rasterization đúng phối cảnh yêu cầu nội suy tuyến tính 1 / z - nội suy tuyến tính của chính z không tạo ra kết quả chính xác. Phần cứng phải tính 1 / z ở mỗi đỉnh và nội suy nó qua một hình tam giác, vì vậy thật tiện lợi khi chỉ cần ghi giá trị đó vào bộ đệm độ sâu thay vì thực hiện phân chia đắt tiền ở mỗi pixel để phục hồi z.

Việc bạn có được độ chính xác z gần với mặt phẳng gần hơn chỉ là tác dụng phụ và không liên quan gì đến động lực đằng sau phép nội suy 1 / z.

Độ sâu lưu trữ khoảng cách. Ánh sáng sử dụng khoảng cách để suy giảm. Nó có thể là mối quan hệ giữa bộ đệm độ sâu và việc triển khai ánh sáng cần có điều này, mặc dù điều đó sẽ chỉ áp dụng nếu thuật toán chiếu sáng chạy trong không gian màn hình mà tôi cho là. Hãy nhớ rằng tốt hơn là luôn luôn lưu trữ nghịch đảo (hoặc phần cứng được tính toán), hơn là phải thực hiện phân chia giá trị không phân chia cho mỗi op trên mỗi khung cần ... và đó có xu hướng là số lượng op rất lớn.

Đây chỉ là một phỏng đoán.


Bạn có thể vào một cái gì đó ở đó. Nó cũng có thể có liên quan đến không gian tính toán ánh sáng. Nhưng tôi không nghĩ bộ đệm sâu là một phần của nó, vì nó lưu trữ 'khoảng cách giả' từ mắt (hoặc mặt phẳng phía trước) đến vật thể, chứ không phải khoảng cách từ ánh sáng đến vật thể. Đó là khoảng cách ánh sáng được sử dụng trong ánh sáng.
Ken

@downvoter - quan tâm để bình luận, hay chỉ trolling? (để trích dẫn Jonathan)
Kỹ sư

Cũng vậy, sự suy giảm được tính toán trong không gian mắt không phải là không gian chuẩn hóa -> phối cảnh / z không liên quan gì đến điều này
Oliver Zendel

1

Cũng như một phần bổ sung: Khi sử dụng mô hình openGL để xấp xỉ nguồn sáng hình cầu, cả ba hệ số đều có ý nghĩa và hợp lệ (không phải "để ngăn chặn tràn" hoặc có "tự do nghệ thuật"):

Đối với một hình cầu có bán kính r chúng ta nhận được:

1 / (d / r + 1) ^ 2

điều này dịch sang

c = 1 k = 2 / r s = (1 / r ^ 2)

(xem http://imdoingitwrong.wordpress.com/2011/01/31/light-atteninating/ ).

Imho xấp xỉ này là tốt hơn so với sử dụng đèn điểm cực nhỏ mà không có sự mở rộng nào cả!


Làm thế nào để công thức 1 / (d / r + 1) ^ 2 đến? Bài báo gốc chỉ nói "Sau khi xem kết quả từ một loạt các bài kiểm tra, nó trở nên rõ ràng", điều này không đủ thuyết phục về câu hỏi đang hỏi về mô hình vật lý.
dùng1914692

0

Tôi có một cái nhìn / câu trả lời khác nhau về công thức.

Khi chúng ta xem một ánh sáng điểm, ví dụ, thực sự chúng ta thấy ánh sáng tán xạ. Vì vậy, công thức của 1 / d ^ 2 chỉ dành cho ánh sáng phát ra của pixel đó. Nhưng độ sáng trong máy ảnh của pixel đó sẽ có công thức phức tạp hơn, sử dụng lý thuyết tán xạ ánh sáng. Xem giấy

"Lấy mẫu biểu sinh cho bóng và tia sáng trong việc tham gia phương tiện với tán xạ đơn"

của Thomas Engelhardt, Carsten Dachsbacher Nhưng thật không may, họ không có một công thức đơn giản cuối cùng để tán xạ ánh sáng. Tôi đoán có lẽ hiệu ứng giả GPU cuối cùng sẽ tương tự như công thức tuyến tính và bậc hai.

Vì vậy, tôi nghĩ rằng yêu cầu:

"Nếu bạn đang cố gắng bắt chước thực tế, bạn muốn bình phương nghịch đảo (và gamma chính xác)" là không hợp lệ.

Trên thực tế tôi sử dụng công thức với các yếu tố tuyến tính và bậc hai mà không có gamma có thể bắt chước các hiệu ứng phát sáng rất tốt. Tuyến tính không thể.

Trong một bản tóm tắt ngắn, công thức có đối tác vật lý của tán xạ ánh sáng.

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.