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 glDrawArrays
z 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_VertexID
Któ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 .