Czy istnieje sposób generowania prymitywów w module cieniującym geometrię bez żadnej geometrii wejściowej?


17

Kilka lat temu próbowałem zaimplementować ten klejnot GPU w OpenGL do generowania terenu proceduralnego 3D za pomocą Marching Cubes . Artykuł sugeruje wdrożenie Marching Cubes w module cieniującym geometrię w celu uzyskania maksymalnej wydajności. Oznacza to, że muszę uruchomić moduł cieniujący raz dla każdego woksela w domenie, a on wygeneruje całą geometrię w tej komórce.

Jednym z problemów, na które natknąłem się było to, jak uruchomić moduł cieniujący geometrię bez konieczności renderowania poza nim. Moim rozwiązaniem (które wydawało się raczej hackingiem) było renderowanie punktu w każdej komórce, odrzucanie go za pomocą modułu cieniującego geometrię i zamiast tego emitowanie moich trójkątów. Nigdy nie znalazłem właściwego rozwiązania, a to obejście pozostało w końcowym kodzie.

Czy w ogóle można powiedzieć OpenGL, aby rozpoczął renderowanie z modułu cieniującego geometrię bez żadnej geometrii wejściowej? Czy też zawsze będę musiał wysyłać kilka fałszywych punktów do GPU, aby wszystko działało.

Odpowiedzi:


15

Nie, tak naprawdę nie ma na to sposobu.

Wywołanie modułu cieniującego geometrię wymaga operacji podstawowej na wejściu i generuje 0 lub więcej operacji podstawowych na wyjściu. Bez prymitywów wejściowych tak naprawdę nie ma sposobu na wywołanie modułu cieniującego geometrię . Oczywiście możesz rozciągnąć granice maksymalnej liczby operacji podstawowych modułu cieniującego geometrię dla każdej operacji podstawowej (nie znam obecnie praktycznych limitów, może być rzędu tysięcy). Być może więc możesz wygenerować 1024 trójkąty dla każdego punktu, ale zawsze musisz mieć pewne prymitywy wejściowe.

Czego nie trzeba jednak jest rzeczywiste pojęcie geometrii. Tak naprawdę nie musisz renderować punktów 3D w żadnej rozsądnej lokalizacji, mogą one również mieć tylko niektóre abstrakcyjne współrzędne indeksu lub tekstury lub cokolwiek innego jako atrybuty i niekoniecznie znaczącą pozycję 3D. Nikt nie decyduje, jakie atrybuty mają twoje wierzchołki. Możesz nawet renderować wierzchołki bez żadnych atrybutów . Ale musisz wyrenderować niektóre prymitywy, aby wywołać na nich moduł cieniujący geometrię, nawet jeśli te prymitywy nie mają żadnych rzeczywistych atrybutów (jednak jak obliczyć geometrię wyjściową w module cieniującym geometria to inne pytanie).

Ale to, co faktycznie zrobiłeś, wyświetlenie punktu dla każdej komórki siatki i wygenerowanie z niej trójkątów marszowych dla tej komórki, jest dokładnie prostym podejściem. Oczywiście, jakie atrybuty zawiera ta komórka, zależy od Ciebie, może to być pozycja 3D, tekstcoord w teksturę 3D, cokolwiek, ale są to komórki siatki, które renderujesz. Mówiąc czysto semantycznie, tak naprawdę nie „odrzucasz” tych punktów, a następnie „zastępujesz” je trójkątami, „konwertujesz” każdy punkt na zestaw trójkątów. Właśnie do tego służy moduł cieniujący geometrię i nie ma w tym nic „hacky” lub „niewłaściwy”. Nikt nie mówi, że moduł cieniujący geometrię musi generować ten sam pierwotny typ wyjściowy, co wejściowy, aby był „prawidłowy” .


To, co możesz zrobić, aby uzyskać w dużej mierze bez wkładowy sposób renderowania siatki wokseli (a może o to tak naprawdę prosiłeś), to po prostu narysować zestaw punktów bez atrybutów. Oznacza to, że nie potrzebujesz żadnych tablic atrybutów, po prostu je wszystkie wyłączasz i wywołujesz prosty glDrawArraysz odpowiednią liczbą komórek. Następnie w module cieniującym wierzchołki lub cieniującym geometrię możesz wygenerować niezbędny indeks komórek siatki 3D z niewielką magią indeksu na podstawie wejściowego identyfikatora wierzchołka (tj. gl_VertexIDKtóra jest jedyną dostępną informacją), a następnie obliczyć geometrię marszowych kostek z wyszukiwania do tekstura objętości 3D (lub jakakolwiek struktura danych).

Tak więc z perspektywy czasu powinienem relatywizować moją instrukcję od początku: nie możesz generować prymitywów bez żadnych prymitywów wejściowych , ale możesz wygenerować je bez żadnej geometrii wejściowej .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.