2013-09-06 53 views
5

Mam pytanie dotyczące modułów cieniujących Compute. są shadery obliczeniowe dostępne w DX 9? czy nadal byłoby możliwe użycie shadera obliczeniowego ze sterownikiem DX9, jeśli nie ma fragmentu modułu cieniującego Compute na GPU? (SGX 545 go nie ma, ale generacja SGX 6X będzie je miała), o ile mówi IMG. Chciałbym wiedzieć, czy mogę wykonać proste ogólne programowanie na GPU SGX z sterownikami DirectX9 lub OpenGL.Kompilacja ogólnego zastosowania z modułami cieniowania wierzchołków/pikseli (Open GL/DirectX)

Co więcej, czy w ogóle mogę korzystać z procesorów GPGPU w OpenGL? Oto, co myślę: Załaduję moje Matryce/dane do bufora wierzchołków i powiązam je z kontekstem programu. Załaduję kilka innych zmiennych statycznych do jednolitych zmiennych, a mój aktualny program obliczeniowy do vertex shader. Wydaje się, że jest to wykonalne do tego momentu (prawda?), Ale dane wyjściowe z modułu cieniującego werteksów będą przechodzić przez rasteryzację i będą dostarczane do shaderów fragmentów (zgodnie z tym, jak to wszystko wygląda w OpenGL). Czy mimo to mogę uniemożliwić przechodzenie danych przez całą linię pylącą grafiki, czy też mogę przechwycić po wykonaniu shadera werteksów przy wykonywaniu i jakoś odczytać wartości i czas potrzebny na wykonanie?

Odpowiedz

3

czy w ogóle mogę używać procesorów werteksów OpenGL do programowania GPGPU?

Rzeczy, które wychodzą z modułu cieniującego wierzchołków, są generalnie interpolowane na etapie raserizacji. W starych wersjach OpenGL możesz określić, czy taka interpolacja powinna, czy nie powinna się zdarzyć w przypadku konkretnych zmiennych. Nie wiem, czy nadal możesz to zrobić ... Tak, nadal możesz (dla danych terminarzy na końcu) ... ale lepszym podejściem, moim zdaniem, jest użycie shaderów fragmentów. Renderuj do pełnej klatki, używając prostego modułu do cieniowania wierzchołków, który renderuje dwa trójkąty, które obejmują całą ramkę (quad), tak jak w przypadku efektu końcowego procesu, i wykonaj obliczenia w module cieniującym fragment. Umieść dane, które chcesz wykorzystać jako dane wejściowe w teksturach, i wyeksponuj wyniki w innych teksturach za pomocą obiektów bufora ramki (FBO).

+2

Jestem bardzo lubi tego podejścia siebie, ponieważ pozwala na dużo GPGPU rzeczy w nieoczekiwanych kontekstach (naprawdę znaczy _WebGL_). Jeśli możesz zbudować swój algorytm tak, aby działał dobrze w implementacjach, które nie obsługują celów renderowania zmiennoprzecinkowego, byłbyś zaskoczony, jak wiele urządzeń jest zdolnych do GPGPU. Ponieważ sprzężenie zwrotne transformacji nie jest możliwe w OpenGL ES 2.0, myślę, że jedynym sposobem, aby poradzić sobie z tym w sposób przenośny, jest wykorzystanie etapu cieniowania wierzchołków jako prostego przekazu, tak jak powiedziałeś, i wykonania pracy w shaderze fragmentów. –

+2

Cóż, jest jedna wada, wykorzystując stan fragmentów do obliczeń: Nie pozwala na wykonywanie zapisów rozproszonych, co może być problemem dla niektórych algorytmów.W zależności od tego, co faktycznie chcesz zrobić, możesz użyć etapu shaderów wierzchołków, aby wykonać obliczenia "rozpraszania", emitując położenie punktów pojedynczego piksela i umożliwiając modułowi cieniującemu wykonywanie komplikacji zlokalizowanych. – datenwolf

+0

@darius: Nadal można włączyć interpolację dla wybranych opcji. – datenwolf

3

Czy mimo to mogę zapobiec dane być przeżywa cały się pipleline graficznej, czy mogę przechwycić po vertex shader odbywa z wykonaniem i jakoś odczytać wartości i czasu potrzebnego do wykonania?

Tak.
Potencjalnie możesz użyć vertex shadera do swoich obliczeń, wyłączyć etapy teselacji i shader geometrii i przechwycić wyniki z informacji zwrotnej o transformacji.

Poniżej znajduje się OpenGL Rendering Pipeline.

Opcjonalne etapy mają pasiastą ramkę.
Programowalne stopnie są niebieskie.

OpenGL Rendering Pipeline

+1

Prawdopodobnie można skrócić rasteryzację, po prostu ustawiając współrzędną W każdego wierzchołka na 0,0. Teoretycznie podział perspektywy spowodowałby przycięcie każdego z tych wierzchołków. Oczywiście, jeśli chciałbyś użyć W dla czegoś znaczącego, masz pecha :) A to nie rozwiązuje dylematu OpenGL ES niestety, ponieważ ES i ES 2.0 nie mają informacji zwrotnej z transformacji. –

+0

@DylanHolmes: Dziękuję bardzo. więc chcesz powiedzieć, że mogę wyłączyć pikselowy moduł cieniujący? Czy istnieje sposób na odczytanie danych z transformowanego kanału? Czy istnieje jakiś samouczek lub programy przykładowe, które mogą mi pomóc? Jestem początkującym użytkownikiem OpenGL. –

+0

Możesz "wyłączyć" moduł cieniujący pikseli, ustawiając współrzędne w każdego wierzchołka na 0, na przykład @ AndonM.Coleman. Doskonały samouczek na początek to http://www.opengl-tutorial.org/ –