Чому вентилятори трикутника не підтримуються в Direct3D 10 або новіших версіях?


16

Як зазначено в документації, вентилятори трикутника не підтримуються в Direct3D 10 або новіших версіях .

Чому? Чи є притаманні недоліки роботи з вентиляторами трикутника?


5
Я розумію, що через те, що вентилятори трикутників часто призводять до дуже худих довгих трикутників, в результаті чого інтеропи викликають артефакти. Крім того, я думаю, що для отримання спроб, які не пов'язані з вентилятором, потрібні окремі дзвінки внічию. Де це можливо за допомогою смужки. Я не думаю, що є щось, що можуть зробити шанувальники, що смужки не можуть зробити краще.
ClassicThunder

3
Вентилятори можна підключити за допомогою індексів, тому не потрібно робити окремі дзвінки. Це ж стосується і смуг (і ви можете навіть з'єднувати вентилятори з планками), який набагато гнучкіший, не вимагає вироджених трис і більш легкий з точки зору пропускної здатності.
Максим Мінімус

Відповіді:


15

Протягом більш ніж десятиліття постачальники обладнання висувають трикутники, індексовані списки трикутників та індексовані трикутники як найшвидші примітивні типи для використання. Чому? Смуги мають кращу локальність кешу (повторне використання останніх двох версій, поданих замість того, щоб постійно переходити назад до першого), а індексація дозволяє кеш вершин вершин фактично працювати, а також є більш ефективною для усунення дублікатів вертів.

Якщо всі постачальники обладнання говорять "зроби це так, і ти будеш швидше", то є досить хороший шанс, що якщо ти зробиш це таким чином, то насправді станеш швидшим.

Тож D3D10 + просто формалізує це; якщо це швидкий шлях, то це шлях, який ви будете використовувати, а інші шляхи не існуватимуть. Це відповідає одній з філософій дизайну D3D10 +, яка полягає у тому, щоб перевести вас на швидкий шлях і утримати вас там.


4

Я не знаю, наскільки це насправді впливає на розвиток, але як і при будь-яких подібних змінах, їм сказали, що вони дозволять розробникам драйверів писати кращі драйвери. Складність драйверів GPU вражає, але я не впевнений, чи допоможе ця точна зміна.

У будь-якому випадку можлива заміна вентиляторів трикутника для більшості ваших потреб (наприклад, опуклий багатокутник) на смужки, часто з кращими результатами.

// 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 ] );
}

EDIT: забув згадати - якщо вам потрібно змінити порядок намотування - просто переверніть тест у такому "if" (== to! =).


3

(Це конкретне запитання вимагає думки відповіді :)

Суб'єктивно, я б сказав, її архітектурний космонавтизм. OpenGLES також викинув багато речей, щоб зробити його «менш складним», а насправді просто підштовхує складність до кожного розробника із застарілим кодом.

Звичайно, навіть коли апаратне забезпечення не підтримує його споконвічно, було б тривіально забезпечити сумісність з людьми, що послідовно розгортають вентилятори трикутника, перетворюючи їх на смужки чи трикутники.

Часи запуску WebGL і такі повинні постійно відслідковувати перевірені буфери та такі, і водії можуть легко керувати людьми, що надсилають їм фанати, незважаючи на те, що вони не підтримують це.

Таким чином, все викидання з FFP і таке - просто велике роздратування IMO.


10 і більше років тому це було б гарною відповіддю. Сьогодні вершина конвеєра майже завжди реалізована апаратно, і дані вершин, швидше за все, зберігаються в буферних об'єктах в пам'яті GPU, тому гіпотетична реалізація вентилятора на смужку у драйвері вимагатиме повернення даних вершин до пам'яті процесора для переупорядкування, а потім перезавантаження його в пам'ять GPU. Це не тільки руйнує всю точку використання буферних об’єктів (оскільки у вас більше немає статичних даних вершин), але й вимагає повторного перегляду з пам’яті графічного процесора, так що привітні стоянки конвеєра та низька продуктивність.
Максим Мінімус

1
@ mh01 яке обладнання не підтримує вентилятор спочатку? HW повинен працювати з повною OpenGL після всього ...
Воля

Дані вершини можуть зберігатися в пам'яті GPU, але вони повинні якось потрапляти з системної пам'яті (принаймні один раз). Це через водія. (Якщо припустити, що дані походять зі сторони процесора, що, за винятком спеціалізованих апаратних демонстрацій, це майже завжди).
BrainSlugs83
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.