Làm thế nào để shader Raymarch làm việc?


49

Tôi đã xem xét các shader được tìm thấy ở đây shadertoy.com và hầu hết những cái mát đều có tiếng ồn và raymarch chung. Tôi hoàn toàn không hiểu mã nguồn nhưng tôi thực sự muốn. Làm thế nào để các shader này hoạt động và thuật toán raymarch hoạt động như thế nào? Tôi đã tìm kiếm khắp nơi và không thể tìm thấy bất cứ điều gì về chủ đề này.

Cảm ơn


6
Iñigo Quilez đã viết hướng dẫn tuyệt vời về điều đó. Xem iquilezles.org/www/articles/raymarchingdf/raymarchingdf.htm , iquilezles.org/www/material/nvscene2008/nvscene2008.htmiquilezles.org/www/articles/distfunctions/distfunctions.htm . Những shader mát mẻ này không chỉ là bất kỳ trường hợp raymar, mà cụ thể là các trường khoảng cách raymar, còn được gọi là theo dõi hình cầu.
msell

Bạn đang hỏi về diễu hành tia nói chung hay diễu hành tia trên GPU?
Concept3d

@Milo Bạn có thể làm rõ câu hỏi của bạn? Bạn có hỏi làm thế nào các thuật toán này được sử dụng để tạo ra hình ảnh bạn nhìn thấy trong các bản demo tuyệt vời không? Bạn đang hỏi làm thế nào tia diễu hành hoạt động? Bạn có hỏi làm thế nào tia diễu hành trong các shader mảnh / pixel (nghĩa là thực hiện hiệu quả) hoạt động?
TravisG

Tôi đã triển khai Raymarching trong Unity Engine github.com/smkplus/UnityRayMarching
Seyed Morteza Kamali

Câu trả lời:


79

Có lẽ dễ hiểu nhất bởi sự tương phản với raytracing.

Để hiển thị một nguyên thủy với raytracing, bạn cần một hàm, đưa ra tia nguyên thủy và tia đầu vào, cho bạn biết chính xác nơi tia đó chạm vào nguyên thủy. Sau đó, bạn có thể kiểm tra tia chống lại tất cả các nguyên thủy có liên quan và chọn giao điểm gần nhất. CPU rất tốt trong việc này.

Với raymarching, bạn không có chức năng giao thoa tia đơn giản như vậy. Cho một điểm trên tia, bạn có thể ước tính điểm đó ở gần bề mặt, nhưng bạn không biết chính xác bạn cần kéo dài tia đó bao xa để chạm vào bề mặt.

Vì vậy, bạn "diễu hành" từng bước một:

  1. Bắt đầu tại "điểm bắt đầu" của tia - mặt phẳng gần để hiển thị cảnh hoặc giao điểm với âm lượng giới hạn nếu đó chỉ là một đối tượng trong cảnh. (P0 trong sơ đồ bên dưới)

  2. Đánh giá chức năng khoảng cách của bạn để có được ước tính mức độ gần của bạn với bề mặt. (Vòng tròn lớn nhất trong sơ đồ)

  3. Di chuyển về phía trước dọc theo tia theo ước tính của bạn. Việc di chuyển nên được bảo tồn ngắn, vì vậy bạn tự tin rằng bạn sẽ không chui qua bề mặt ở bất cứ đâu.

  4. Bây giờ bạn có một điểm mới (P1 bên dưới) - lấy ước tính mới và lặp lại.

  5. Tiếp tục nhận ước tính và bước về phía trước cho đến khi bạn đạt được trong một khoảng cách ngưỡng của bề mặt, hoặc bạn đạt số bước tối đa của mình. (P4 bên dưới)

  6. Bây giờ bạn có độ sâu của bề mặt và có thể suy ra những thứ như quy tắc / tắc xung quanh từ các mẫu gần đó và sử dụng dữ liệu này để chiếu sáng & tô màu pixel.

Di chuyển một tia từ P0 về phía giao điểm của nó

Sơ đồ ví dụ từ GPU Gems 2, chương 8

Bởi vì mỗi tia là độc lập và chỉ sử dụng (nói chung) thông tin cục bộ ở mỗi bước, nên nó đã chín muồi để song song hóa trên GPU. Thông thường, chỉ có hai hình tam giác sẽ được vẽ trên màn hình. Sau khi raster những cái này, mỗi pixel được chuyển đến shader mảnh đại diện cho một tia. Shader mảnh vỡ di chuyển tia đó cho đến khi nó chạm tới bề mặt, trả về kết quả (thường chỉ là giá trị độ sâu cho kết cấu & tô bóng trong một đường chuyền toàn màn hình riêng biệt).

Các bước chính xác phụ thuộc rất nhiều vào hiệu ứng cụ thể mà bạn đang cố gắng đạt được. Kỹ thuật bắn tia được sử dụng với ...

  • trường chiều cao để mô phỏng sự dịch chuyển bề mặt trên hình học rasterized truyền thống (ánh xạ tắc thị sai)
  • bộ đệm độ sâu cảnh cho những thứ như phản xạ không gian màn hình
  • kết cấu khối để hiển thị các bộ dữ liệu được lấy mẫu 3D (thường là khoa học / y tế)
  • các hàm ẩn để hiển thị những thứ như fractals
  • các trường khoảng cách thủ tục như trong tác phẩm của Iñigo Quilez (liên kết tuyệt vời từ msell trong các ý kiến ​​ở trên).

Raymarching cũng được sử dụng với pha trộn ở mỗi bước (thường sử dụng các bước cố định thay vì ước tính khoảng cách mỗi lần) để hiển thị độ mờ thể tích, như trong ví dụ này từ Wikipedia .

Raymarching một kết cấu khối mờ

Điều này đã trở thành một cách phổ biến để hiển thị các đám mây chi tiết trong thời gian thực .

Ngay cả Bản đồ nội thất , một cách mô phỏng chi tiết phòng bên trong cửa sổ tòa nhà, có thể được coi là một hình thức chiếu tia, trong đó tia được bước từ điểm đi vào cửa sổ đến tường, sàn / trần hoặc mặt phẳng đồ nội thất gần nhất.

Nếu có một loại hiệu ứng raymar cụ thể mà bạn quan tâm, có lẽ bạn có thể nhận được câu trả lời chi tiết hơn bằng cách đặt câu hỏi mới với các ví dụ cụ thể. Là một gia đình, kỹ thuật này quá đa dạng để bao quát mọi thứ trong một câu trả lời ngắn. ;) Tôi hy vọng điều này cung cấp cho bạn một khuôn khổ để hiểu những gì đang diễn ra dưới mui xe trong các shader này.

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.