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?
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?
Odpowiedzi:
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.
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! =).
(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.