Dlaczego wentylatory trójkątne nie są obsługiwane w Direct3D 10 lub nowszym?

16

Jak opisano w dokumentacji, wentylatory trójkątne nie są obsługiwane w Direct3D 10 lub nowszym .

Dlaczego? Czy istnieją nieodłączne wady pracy z fanami trójkątów?

Micah Bolen
źródło
5
Rozumiem, że ponieważ fani trójkątów często skutkują bardzo chudymi długimi trójkątami, co powoduje interakcje powodujące artefakty. Myślę też, że wymaga osobnych wywołań losowania, aby renderować wszelkie próby niezwiązane z wentylatorem. Gdzie to możliwe z paskiem. Nie sądzę, aby fani mogli zrobić coś, czego paski nie mogłyby zrobić lepiej.
ClassicThunder
3
Wentylatory można łączyć za pomocą indeksów, więc nie są potrzebne osobne połączenia. To samo dotyczy pasków (i można nawet łączyć wentylatory za pomocą pasków), który jest znacznie bardziej elastyczny, nie wymaga zdegenerowanych tris i jest lżejszy pod względem przepustowości.
Maximus Minimus,

Odpowiedzi:

15

Przez ponad dekadę producenci sprzętu pchali paski trójkątów, indeksowane listy trójkątów i indeksowane paski trójkątów jako najszybsze prymitywne typy w użyciu. Dlaczego? Paski mają lepszą lokalizację pamięci podręcznej (ponowne użycie 2 ostatnich przesłanych wierzchołków zamiast ciągłego przeskakiwania do pierwszego), a indeksowanie pozwala sprzętowej pamięci podręcznej wierzchołków faktycznie działać, a także jest bardziej skuteczne w eliminowaniu duplikatów wierzchołków.

Jeśli wszyscy dostawcy sprzętu powiedzą „zrób to w ten sposób, a będziesz szybszy”, istnieje spora szansa, że ​​jeśli zrobisz to w ten sposób, faktycznie będziesz szybszy.

Więc D3D10 + po prostu to formalizuje; jeśli jest to szybka ścieżka, to jest to ścieżka, którą zamierzasz użyć, a inne ścieżki nie będą istnieć. Jest to zgodne z jedną z filozofii projektowania D3D10 +, która polega na wprowadzeniu cię na szybką ścieżkę i utrzymaniu tam.

Maximus Minimus
źródło
4

Nie wiem, jak bardzo to wpływa na rozwój, ale jak w przypadku takich zmian, powiedziano, że pozwolą twórcom sterowników pisać lepsze sterowniki. Złożoność sterowników GPU jest niesamowita, ale nie jestem pewien, czy ta dokładna zmiana bardzo pomoże.

W obu przypadkach możliwe jest zastąpienie wentylatorów trójkątnych dla większości twoich potrzeb (takich jak wypukłe renderowanie wielokątów) paskami, często z lepszymi wynikami.

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

EDYCJA: zapomniałem wspomnieć - jeśli chcesz zmienić kolejność nawijania - po prostu odwróć test w tym „jeśli” (== do! =).

snake5
źródło
3

(To konkretne pytanie uzasadnia odpowiedź opinii :)

Subiektywnie powiedziałbym, że jest to architektura astronautyczna. OpenGLES wyrzucił również wiele rzeczy, aby uczynić go „mniej złożonym”, a jednocześnie w rzeczywistości popychając złożoność do każdego programisty ze starszym kodem.

Oczywiście, nawet jeśli sprzęt nie obsługuje go natywnie, byłoby trywialne zapewnienie zgodności z ludźmi sekwencjonującymi wentylatory trójkątne, przekształcając je w paski lub trójkąty.

Czasy działania WebGL i takie muszą cały czas śledzić sprawdzone bufory, a kierowcy mogą łatwo zarządzać ludźmi, którzy wysyłają do nich fanów, mimo że ich nie obsługują.

Więc całe wyrzucanie FFP i takie jest po prostu wielką irytacją IMO.

Wola
źródło
10 lub więcej lat temu byłaby to dobra odpowiedź. Obecnie potok wierzchołków jest prawie zawsze implementowany sprzętowo, a dane wierzchołków są częściej przechowywane w obiektach buforowych w pamięci GPU, więc hipotetyczna implementacja typu fan-to-strip w sterowniku wymagałaby przeniesienia danych wierzchołków z powrotem do pamięci procesora do zmiany kolejności, a następnie ponownego załadowania do pamięci GPU. To nie tylko rujnuje cały sens używania obiektów buforowych (ponieważ nie masz już statycznych danych wierzchołków), ale wymaga ponownego odczytu z pamięci GPU, więc cześć wstrzymanie potoku i niska wydajność.
Maximus Minimus
1
@ mh01 jaki sprzęt nie obsługuje natywnie wentylatora? HW musi przecież pracować z pełną wersją OpenGL ...
Będzie
Dane wierzchołków mogą być przechowywane w pamięci GPU, ale muszą one jakoś dotrzeć z pamięci systemowej (przynajmniej raz). To przez kierowcę. (Zakładając, że dane pochodzą od strony procesora, co, oprócz wyspecjalizowanych demonstracji sprzętowych, prawie zawsze tak jest).
BrainSlugs83