2010-10-12 16 views
12

Czy można użyć modułu cieniującego do obliczenia niektórych wartości, a następnie zwrócić je do ponownego wykorzystania?Używanie modułu cieniującego do obliczeń

Na przykład wysyłam siatkę do procesora graficznego, z niektórymi parametrami dotyczącymi sposobu modyfikacji (zmieniać położenie wierzchołków) i odbierać wynikową siatkę? Widzę to raczej niemożliwe, ponieważ nie widziałem żadnej zmiennej do komunikacji z shaderów do CPU. Używam GLSL, więc są tylko mundury, atrybuty i różne. Czy powinienem użyć atrybutu lub jednolitego, czy po renderowaniu będą nadal prawidłowe? Czy mogę zmienić wartości tych zmiennych i odczytać je z powrotem w CPU? Istnieją metody mapowania danych w GPU, ale czy byłyby one zmienione i poprawne?

Tak myślę o tym, choć może być inny sposób, który nie jest mi znany. Byłbym szczęśliwy, gdyby ktoś mógł mi to wyjaśnić, ponieważ właśnie przeczytałem kilka książek o GLSL, a teraz chciałbym zaprogramować bardziej złożone shadery i nie chciałbym zwolnić metod, które są obecnie niemożliwe.

Dzięki

Odpowiedz

6

Świetne pytanie! Witamy w nowym, odważnym świecie komputerów ogólnego przeznaczenia do przetwarzania grafiki (GPGPU).

Co można zrobić z pixel shaderami. Załadujesz teksturę (to znaczy: dane), zastosujesz moduł cieniujący (aby wykonać żądane obliczenia), a następnie użyj polecenia Renderuj do tekstury, aby przekazać wynikowe dane z procesora graficznego do pamięci głównej (RAM).

Istnieją narzędzia stworzone do tego celu, przede wszystkim OpenCL i CUDA. W znacznym stopniu pomagają GPGPU, więc tego rodzaju programowanie wygląda niemal jak programowanie CPU.

Nie wymagają one grafiki 3D (choć nadal preferowane :)). Nie musisz robić sztuczek z teksturami, wystarczy załadować tablice do pamięci GPU. Algorytmy przetwarzania są napisane w nieco zmodyfikowanej wersji C. Najnowsza wersja CUDA obsługuje C++.

Polecam zacząć CUDA, ponieważ jest to najbardziej dojrzała jeden: http://www.nvidia.com/object/cuda_home_new.html

+0

Jak napisał testalino, CUDA jest specyficzna dla nVidii. Jako że korzystam z Radeona, czy nie powinienem cierpieć z powodu spowolnienia, czy nawet można uruchomić CUDA na Radeonie? Czy OpenCL jest mniej efektywny lub dlaczego nie polecasz go jako pierwszego? – Raven

+0

@Raven Tak, CUDA jest całkowicie specyficzna dla nVidia.Gdybym miał wybrać, wolałbym CUDA + nVidia. Ponieważ masz ATI, musisz wybrać OpenCL. O ile wiem, CUDA jest bardziej dojrzała, narzędzia są lepsze, itp. Pod względem wydajności nie sądzę, że jest znacząca różnica. – Andrey

+0

@Raven, wybrałbym Direct Compute, jeśli korzystałem już z Direct X, Open CL, jeśli używałem Open GL. Nigdy nie używałbym CUDA z podanego powodu. Nie możesz się upewnić, że wszyscy korzystający z Twojej aplikacji mają kartę NVIDIA. – testalino

0

Mój najlepszy przypuszczenie byłoby wysłać do BehaveRT który jest biblioteką stworzony aby wykorzystać GPU dla modeli behavorial. Myślę, że jeśli możesz sformułować swoje modyfikacje w bibliotece, możesz skorzystać z jego abstrakcji

Informacje o przechodzeniu między procesorem a gpu, pozwolę ci przejrzeć dokumentację, nie jestem pewien o tym

2

Jest to łatwo możliwe na nowoczesnych kartach graficznych za pomocą Open CL, Microsoft Direct Compute (część DirectX 11) lub CUDA. Używane są normalne języki modułu cieniującego (np. GLSL, HLSL). Pierwsze dwie prace na kartach graficznych Nvidia i ATI, cuda to wyjątek nvidia.

Są to specjalne biblioteki do przetwarzania danych na karcie graficznej. Nie używałbym do tego zwykłego API 3D, chociaż jest to możliwe z niektórymi obejściami.

1

Teraz można korzystać z obiektów buforowe shader w OpenGL pisać wartości shaderów, które można odczytać w komputerze.

Powiązane problemy