Різні шейдери для різних об’єктів DirectX 11


13

Я навчаюсь Direct3D 11, і у всіх основних навчальних посібниках, які я знайшов у написанні шейдерів, шейдери Vertex і Pixel написані, щоб вони перетворили всю сцену однаково. Підручники, як куб візуалізації з текстурою ...

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

Дякую.

Відповіді:


23

Так, ігровий двигун взагалі матиме безліч різних шейдерів. Типовою схемою є:

  1. Під час ініціалізації двигуна та завантаження ігрового світу підготуйте всі шейдери, які ви будете використовувати для візуалізації. Під «підготовкою» я маю на увазі завантаження їх у пам’ять, компілюйте їх за необхідності та виконайте всі ID3D11Device::CreatePixelShaderподібні дзвінки, щоб отримати виділені та готові до роботи об’єкти шейдерів D3D. Зберігайте об'єкти в масиві чи іншій структурі даних.

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

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

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

  3. Щоб намалювати, просто переведіть петлю на шейдери, встановіть кожен шейдер у ID3D11DeviceContext, встановіть будь-які параметри (постійні буфери, текстури тощо), а потім намалюйте об'єкти. У псевдокоді, включаючи відмінність шейдерів / матеріалів, я згадував:

    for each shader:
        // Set the device context to use this shader
        pContext->VSSetShader(shader.pVertexShader);
        pContext->PSSetShader(shader.pPixelShader);
    
        for each material that uses this shader:
            // Set the device context to use any constant buffers, textures, samplers,
            // etc. needed for this material
            pContext->VSSetConstantBuffers(...);
            pContext->PSSetConstantBuffers(...);
            pContext->PSSetShaderResources(...);
            pContext->PSSetSamplers(...);
    
            for each mesh that uses this material:
                // Set any constant buffers containing parameters specific to the mesh
                // (e.g. world matrix)
                pContext->VSSetConstantBuffers(...);
    
                // Set the context to use the vertex & index buffers for this mesh
                pContext->IASetInputLayout(mesh.pInputLayout);
                pContext->IASetVertexBuffers(...);
                pContext->IASetIndexBuffer(...);
                pContext->IASetPrimitiveTopology(...)
    
                // Draw it
                pContext->DrawIndexed(...)

Існує набагато більше, що можна сказати про керування об'єктами, сітками, шейдерами, макетами вводу, постійними буферами тощо, але цього має бути достатньо для початку роботи. :)


Ви пропонуєте сортувати за шейдером, а потім за матеріалами. Чи є у вас важкі дані про вартість перемикання шейдерів на комутаційні матеріали? О, а для DX9 комбінація VS / PS називається "програмою". Я не впевнений, чи все ще вони використовують цю термінологію в DX11.
Піжама Panda

1
@PandaPajama Це гарне питання. Ні, я не маю чи не знаю жодних останніх вимірів фактичної вартості комутації матеріалів чи шейдерів. Такий підхід уже багато років є "загальною мудрістю", але варто зробити деякі фактичні виміри, щоб побачити, як змінилися речі ... можливо, я це зроблю, якщо знайду час. :)
Натан Рід
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.