Làm cách nào tôi có thể sử dụng đường ống đồ họa để hiển thị dữ liệu thể tích dựa trên hàm mật độ?


12

Cả hai API đồ họa (OpenGL và DirectX) đều tạo ra một đường ống được xác định rõ trong đó một số giai đoạn có thể lập trình được. Các giai đoạn lập trình này yêu cầu lấy một lượng dữ liệu tối thiểu cố định và được cho là thực hiện một phạm vi hoạt động được xác định rõ trên nó và xuất ra một số đầu ra tối thiểu được xác định, để dữ liệu có thể được chuyển sang giai đoạn tiếp theo một cách chính xác. Có vẻ như các đường ống này được thiết kế để chỉ hoạt động với một số lượng dữ liệu hình học hạn chế, trong trường hợp cả D3D và OGL là dữ liệu đỉnh và tọa độ kết cấu.

Nhưng, nếu được đưa ra một trường hợp khi ứng dụng mà tôi dự định thực hiện không sử dụng các đỉnh (hoặc thậm chí là voxels) để biểu diễn dữ liệu hình học của nó và không thực hiện chính xác các phép biến đổi hoặc dự đoán hoặc rasterisation hoặc nội suy hoặc bất cứ điều gì tương tự, các hạn chế đó của API hoặc đường ống làm cho mọi thứ khó khăn.

Vì vậy, có cách nào để chúng ta có thể thay đổi đường ống đồ họa theo cách sao cho chức năng của từng giai đoạn đối với dữ liệu và loại dữ liệu được xuất trong mỗi giai đoạn được thay đổi thành lợi thế của tôi không? Nếu không, thì có cách nào để tôi có thể sử dụng các hàm API 'thô' để xây dựng đường ống dẫn của riêng mình không? Nếu không, sau đó xin vui lòng đề cập tại sao nó không thể.

EDIT : Ứng dụng của tôi sử dụng các hàm mật độ để biểu diễn hình học. Hàm có một giá trị tại mỗi điểm trong không gian. Tôi chia sự thất vọng của máy ảnh thành một lưới 3d, mỗi khối có thể được chiếu dưới dạng pixel. Trên mỗi khối, tôi tích hợp hàm mật độ và kiểm tra xem giá trị của nó có lớn hơn giá trị bắt buộc không. Nếu có, thì người ta cho rằng một cái gì đó tồn tại trong khối đó và pixel đó tương ứng với khối đó được hiển thị. vì vậy, bây giờ trong trình kết xuất của tôi, tôi muốn truyền hàm (mà tôi biểu thị bằng một chuỗi) cho phần cứng đồ họa thay vì dữ liệu đỉnh trong bộ đệm đỉnh. điều này cũng ngụ ý rằng trình tạo bóng đỉnh sẽ không có các đỉnh để chuyển đổi thành không gian clip homogeniouse và trình tạo bóng mảnh không nhận được thông tin pixel. thay vào đó, bây giờ hầu hết các tìm kiếm và đánh giá xảy ra trên mỗi pixel.


Là 'hàm mật độ chức năng' là một tautology?
Pharap

@Pharap, đó là một lỗi đánh máy. nó chỉ đơn giản là "desity functon" đại diện cho sự hiện diện của "vật chất" trong không gian.
Tia sáng

2
Có vẻ như bạn chỉ muốn xây dựng một isosurface, đây là một vấn đề được nghiên cứu kỹ lưỡng. Bạn đã xem http.developer.nvidia.com/GPUGems3/gpugems3_ch07.html hoặc tìm kiếm trên Metaballs, trực quan hóa đám mây điểm, trích xuất isosurface hoặc kết xuất khối? Ngoài ra, loại hiệu suất nào bạn yêu cầu, điều đó sẽ tạo ra sự khác biệt lớn về sự lựa chọn kỹ thuật bạn tìm kiếm khi kết hợp với sự phức tạp của các tính toán của bạn. Tôi nghĩ rằng bạn cũng sẽ thấy rằng mỗi pixel sẽ gây ra sự lung linh khi máy ảnh di chuyển và pixel phụ sẽ được yêu cầu.
Patrick Hughes

Câu trả lời:


18

Bạn hoàn toàn có thể sử dụng GPU để hiển thị dữ liệu thể tích.

Vì bạn muốn đánh giá một tập hợp các chức năng trên mỗi pixel trên màn hình, nên một cách tiếp cận đơn giản là hiển thị hình tam giác toàn màn hình. Đây chỉ là một hình tam giác duy nhất bao phủ toàn bộ màn hình (thực ra, nó bao phủ nhiều hơn màn hình, vì màn hình không phải là hình tam giác, nhưng các phần ngoài màn hình bị GPU loại bỏ). Sau đó, bạn có thể sử dụng trình đổ bóng pixel (nhận tọa độ màn hình của pixel đang đổ bóng) để tạo một tia xuyên qua âm lượng của bạn, đánh giá các chức năng, bất cứ điều gì bạn cần làm.

(Ngược lại với các câu trả lời khác, tôi không khuyên bạn nên sử dụng trình đổ bóng tính toán vì có vẻ như bạn muốn thực hiện các thao tác trên pixel và trình tạo bóng tam giác + pixel toàn màn hình thường hiệu quả hơn so với trình tạo bóng tính toán mặc dù shader shute chắc chắn cũng sẽ làm việc.)

Phương pháp tam giác toàn màn hình rất phổ biến trong đồ họa thời gian thực cho các hoạt động hậu xử lý, do đó bạn có thể tìm thấy tất cả thông tin bạn cần trên đó với một chút googling.

BTW, có thể bạn sẽ thích đọc Thế giới kết xuất với hai hình tam giác của Iñigo Quílez, một bài nói chuyện mô tả cách hiển thị cảnh 3D được tạo bằng các hàm toán học (cụ thể là trường khoảng cách) bằng kỹ thuật đổ bóng pixel toàn màn hình.


Vì vậy, trình đổ bóng pixel có các đầu vào tùy ý (như chuỗi hoặc các loại đối tượng do người dùng xác định) để tôi có thể chuyển qua các chức năng của mình không?
The Spark Spark

Tôi nghi ngờ rằng bạn sẽ muốn thử chạy trình phân tích cú pháp và / hoặc ngôn ngữ trên các chuỗi chức năng tùy ý trên GPU, điều đó sẽ gây khó xử vì GPU không thực sự có mục đích chung. Nhiều khả năng bạn sẽ muốn tự tạo shader trong mã chính của mình, sau đó để hệ thống đồ họa biên dịch và chạy shader kết quả.
Patrick Hughes

@TheLightSpark Đúng, bạn sẽ không chuyển chuỗi cho trình đổ bóng (các ngôn ngữ tô bóng thậm chí không có loại chuỗi), bạn muốn tạo và biên dịch mã trình đổ bóng cho các chức năng bạn muốn. Điều đó có thể được thực hiện trong thời gian chạy nếu cần thiết.
Nathan Reed

Bắt đầu đọc câu trả lời của bạn, tôi tưởng tượng một màn hình hình tam giác;) Nó có lợi thế không khi chỉ sử dụng một hình tam giác duy nhất thay vì hai cái che màn hình mà không loại bỏ pixel?
danijar

@danijar Có, nó có một lợi thế nhỏ hơn so với sử dụng một hình tứ giác vì một số pixel dọc theo đường chéo sẽ bị mờ hai lần nếu bạn sử dụng hình tứ giác toàn màn hình. Mặt khác, loại bỏ các pixel ngoài màn hình là miễn phí vì trình rasterizer sẽ không tạo ra các pixel đó để bắt đầu.
Nathan Reed

6

Truy tìm tia và các kỹ thuật khác thường được thực hiện với Compute Shader, mà Direct3D đã hỗ trợ kể từ khi phát hành D3D11 và OpenGL đã hỗ trợ kể từ 4.3 (và lâu hơn thông qua việc sử dụng OpenCL và một số mâu thuẫn).


5

Nghe có vẻ giống như bạn muốn sử dụng trình tạo bóng tính toán GPU hoặc sử dụng đối tượng "Bộ đệm lưu trữ bộ đổ bóng" để giúp tăng cường đường ống phù hợp với nhu cầu của bạn. Các nhà toán học, nhà khoa học và những người khác tìm đến GPU để tính toán những thứ không được dịch chính xác thành đồ họa tiêu chuẩn sử dụng loại điều này.

Mặc dù đường ống đồ họa hiện đại rất linh hoạt, các nhà phát triển vẫn có xu hướng vấp ngã ở một số hạn chế. Tuy nhiên, tính năng đổ bóng tính toán giúp chúng ta dễ dàng hơn trong việc không nghĩ về các giai đoạn đường ống vì chúng ta thường nghĩ về đỉnh và đoạn. Chúng tôi không còn bị hạn chế bởi các đầu vào và đầu ra của các giai đoạn đường ống nhất định. Ví dụ, tính năng Đối tượng bộ đệm lưu trữ Shader (SSBO) đã được giới thiệu cùng với các trình đổ bóng tính toán và cung cấp các khả năng bổ sung để trao đổi dữ liệu giữa các giai đoạn đường ống, cũng như đầu vào và đầu ra linh hoạt cho các trình đổ bóng tính toán.

http://community.arm.com/groups/arm-mali-graphics/blog/2014/04/17/get-started-with-compute-shaders

Nếu điều này không chỉ cho bạn đi đúng hướng, bạn có phiền mở rộng khái niệm của bạn không phù hợp với mô hình đỉnh / mảnh không?


Tôi chỉnh sửa câu trả lời của tôi để bao gồm những gì tôi đang làm. tính toán shader dường như là câu trả lời, nhưng chỉ cho tôi biết nếu tôi có thể làm gì khác.
The Spark Spark
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.