Kết xuất hiệu quả với kết cấu 3D


7

Tôi có một kết cấu độ sâu hiện có và một số kết cấu màu khác và muốn xử lý thông tin trong đó bằng cách hiển thị thành kết cấu 3D (dựa trên độ sâu có trong kết cấu độ sâu, nghĩa là một điểm tại (x / y) trong kết cấu độ sâu sẽ được kết xuất thành (x / y / texture (độ sâu, uv)) trong kết cấu 3D).

Đơn giản chỉ cần thực hiện một lệnh gọi thủ công cho mỗi lát của kết cấu 3D (thông qua glFramebufferTextureLayer) rất chậm, vì tôi không biết trước lát cắt nào của kết cấu 3D mà một texel đã cho từ một trong các kết cấu màu hoặc kết cấu chiều sâu. Điều này có nghĩa là toàn bộ quá trình có hiệu quả

for each slice
  for each texel in depth texture
      process color textures and render to slice

Vì vậy, tôi phải lấy mẫu kết cấu độ sâu hoàn toàn trên mỗi lát và tôi cũng phải trải qua quá trình xử lý (ít nhất là cho đến khi loại bỏ;) cho tất cả các texels trong nó.

Nó sẽ nhanh hơn nhiều nếu tôi có thể sắp xếp lại quá trình để

for each texel in depth texture
   figure out what slice it should end up in
       process color textures and render to slice

Điều này có thể không? Nếu vậy thì thế nào?

Những gì tôi thực sự đang cố gắng thực hiện: kết cấu màu chứa thông tin ánh sáng (nhìn từ chế độ xem ánh sáng, đó là bản đồ bóng phản chiếu). Tôi muốn tích lũy thông tin đó trong kết cấu 3D và sau đó sử dụng nó để chiếu sáng cảnh. Cụ thể hơn, tôi đang cố gắng thực hiện thuật toán Khối lượng tuyên truyền ánh sáng của Cryteks.


Sau một số nghiên cứu, có vẻ như điều này sẽ khả thi với việc xử lý gpgpu, ví dụ như các shader tính toán opengl. Nhưng tôi cho rằng có một số lý do kỹ thuật tại sao OpenGL không cho phép ghi trực tiếp lên một phần của z. Nó có phá hủy bộ đệm không?
TravisG

Câu trả lời:


8

Nó rất đơn giản để thực hiện nó trong một lệnh vẽ đơn giản, bằng cách lặp lại mọi texel trong bộ đệm sâu bên trong shader đỉnh. Bạn sẽ chọn vẽ các điểm, có độ phân giải bộ đệm độ sâu hoặc ít hơn, và trong trình tạo bóng đỉnh, bạn sẽ tìm nạp giá trị bộ đệm độ sâu và chiếu nó vào khối, mà kết cấu 3D bao phủ.
Bạn có thể chọn từ trình đổ bóng đỉnh mà bạn muốn hiển thị điểm (ví dụ như trong openGL, bạn chuyển lát đó đến biến gl_Layer ). Sau đó, trong shader mảnh, bạn làm bất cứ tính toán nào bạn muốn.

(Có một tiện ích mở rộng hỗ trợ gl_Layer trong trình tạo bóng đỉnh (GL_AMD_vertex_shader_layer).


Ôi chà, thật hoàn hảo! Thật kỳ lạ, tôi đã tìm kiếm trong một thời gian khá dài nhưng không thể tìm thấy bất cứ điều gì về nó.
TravisG

Ngoài ra, tôi nên đề cập rằng gl_Layer là một phần của đặc tả lõi OpenGL 4.2. Nó chỉ cần thiết như một tiện ích mở rộng nếu bạn muốn giữ ở GL 3.x
TravisG

gl_Layer trong shader hình học được hỗ trợ từ GL 3.2. Vì một biến đầu vào (chỉ đọc) trong shader mảnh được hỗ trợ từ GL 4.3. Nó được đề cập trong tài liệu gl_Layer.
Anastasios G

Có, nhưng không phải trong shader đỉnh.
TravisG

Xin lỗi, tôi đã sai. Tôi đã đọc sai một dòng từ thông số kỹ thuật, nó chỉ nói rằng nó được viết chống lại đặc tả 4.2. Phần mở rộng thực sự chỉ là một phần mở rộng dành riêng cho nhà cung cấp và các trình điều khiển NVIDIA nói chung dường như không thực hiện nó.
TravisG
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.