Trong OpenGL, làm cách nào tôi có thể khám phá phạm vi độ sâu của bộ đệm độ sâu?


11

Tôi đang làm một ứng dụng kết xuất nhiều lượt GL cho iOS. Pass đầu tiên cho kết cấu đệm sâu. Pass thứ hai sử dụng các giá trị trong bộ đệm độ sâu để điều khiển ứng dụng của shader mảnh. Tôi muốn chuyển các giá trị trong bộ đệm độ sâu thành một cái gì đó hữu ích nhưng trước khi tôi có thể làm điều đó tôi cần biết phạm vi giá trị độ sâu của các giá trị bộ đệm độ sâu. Làm thế nào để tôi làm điều này?

Câu trả lời:


10

Phạm vi của các giá trị được ghi vào bộ đệm độ sâu là bất cứ điều gì bạn muốn chúng là. Thông thường, họ rơi vào phạm vi 0-1. Giá trị thực được ghi vào bộ đệm độ sâu được tính trong quá trình chuyển đổi khung nhìn, dựa trên giá trị Z của đỉnh trong không gian NDC (sau khi phối cảnh chia cho w trong không gian clip).

Giá trị độ sâu NDC (Z, sau khi chia phối cảnh cho W) được chia tỷ lệ theo phần độ sâu của chuyển đổi chế độ xem (đưa tọa độ X và Y của bạn vào không gian tọa độ mà bạn liên kết với pixel trong cửa sổ), sau đó được chia tỷ lệ theo (2^n-1)- điều đó có nghĩa được đọc là "hai đến sức mạnh của n" - nlà độ chính xác bit của bộ đệm độ sâu. Giá trị kết quả được ghi vào bộ đệm sâu.

OpenGL tách nghĩa của ma trận chuyển đổi khung nhìn vào glViewportglDepthRange cuộc gọi. glDepthRange là những gì kiểm soát yếu tố tỷ lệ chịu trách nhiệm xác định phạm vi độ sâu bạn đang hỏi về. Bạn có thể gọi glGetFloatv với GL_DEPTH_RANGEbộ chọn để khôi phục phạm vi hiện tại. Điều này sẽ cho phép bạn sử dụng phạm vi mà không giả sử nó là 0 thành 1 (mặc dù 99,9% thời gian, trong thực tế, không ai thay đổi nó).

Đọc thêm, nếu bạn muốn có một cái nhìn sâu sắc về cách tái cấu trúc toán học để theo giá trị Z mọi cách từ không gian mắt đến bộ đệm sâu.


Tôi sẽ đưa cái này cho Josh cho tất cả các tài liệu tham khảo bổ sung và mẹo về tam giác phẳng. Tôi có xu hướng thực hiện một vụ hack trong đó các mặt phẳng clip gần / xa khớp chính xác với phạm vi z của hình học tôi đang hiển thị để độ sâu có các giá trị đẹp. Tôi đang làm gì thế này? Tôi muốn tạo hiệu ứng làm mờ cụ thể vị trí thú vị trong quá trình vượt qua # 2 dựa trên những gì từng có trong bản đồ độ sâu số 1.
dugla

7

Các giá trị trong bộ đệm sâu luôn nằm trong khoảng từ 0-1. Không, đó là mảnh được hiển thị ở độ sâu của mặt phẳng gần và 1 là mảnh đó nằm ở độ sâu của mặt phẳng xa. Và mọi thứ giữa nó.

Nếu bạn muốn biết độ sâu thực sự trong không gian thế giới, thật dễ dàng để tính toán nó từ bộ đệm sâu.

depth = nearPlane + ( farPlane - nearPlane ) * depthBufferValue;

Và đó là lý do tại sao bạn chỉ định các mặt phẳng gần và xa trong matri chiếu của bạn, để có được độ chính xác cao hơn của bộ đệm độ sâu.

Cũng cần lưu ý sự khác biệt giữa độ sâu và khoảng cách khi sử dụng giá trị bộ đệm độ sâu.


@ chú ý. Gần đến rồi. Tôi muốn điều chỉnh lại phạm vi của các giá trị trong độ sâu chính xác là 0 -> 1. Vì vậy, nếu các giá trị độ sâu tối thiểu / tối thiểu được hiển thị là 0,25 / .75 tôi muốn (độ sâu - 0,25) / (. 75 - 0,25). Vì vậy, có cách nào để khám phá min / max của deepbuffer sau pass 1 và sử dụng nó để giải cứu trong pass 2.
dugla

1
@dugla: vì bạn đang hiển thị các hình tam giác, là mặt phẳng, sau đó thực hiện các giá trị độ sâu tối thiểu và tối đa sẽ được liên kết với các đỉnh tối thiểu và tối đa trong cảnh. Nếu bạn biết hai điều này, bạn có thể chuyển đổi thủ công tất cả các cách thông qua đường ống và bạn sẽ biết các giá trị tối thiểu và tối đa bạn sẽ ghi vào bộ đệm sâu. Điều này có thể dễ dàng hơn kết xuất, sau đó đọc lại toàn bộ bộ đệm sâu và lặp lại nó.
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.