Поделиться через


Как создать шейдер оболочки

Шейдер корпуса является первым из трех этапов, которые работают вместе для реализации тесселяции. Выходные данные шейдера корпуса управляют как этапом тесселлятора, так и этапом доменного шейдера. В этом разделе показано, как создать шейдер корпуса.

Шейдер корпуса преобразует набор входных точек управления (из шейдера вершин) в набор точек управления выходными данными. Количество входных и выходных точек может отличаться в содержимом и количестве в зависимости от преобразования (типичное преобразование будет базовым преобразованием).

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

Создание шейдера корпуса

  1. Проектирование шейдера корпуса. См. практическое руководство. Проектирование шейдера корпуса.

  2. Компиляция кода шейдера

  3. Создайте объект шейдера корпуса, используя ID3D11Device::CreateHullShader .

    HRESULT CreateHullShader(
      const void *pShaderBytecode,  
      SIZE_T BytecodeLength,  
      ID3D11ClassLinkage *pClassLinkage,  
      ID3D11HullShader **ppHullShader
    );
    
  4. Инициализируйте этап конвейера, используя ID3D11DeviceContext::HSSetShader.

    void HSSetShader(
      ID3D11HullShader *pHullShader,  
      ID3D11ClassInstance *const *ppClassInstances,
      UINT NumClassInstances
    );
    

Шейдер домена должен быть привязан к конвейеру, если шейдер корпуса привязан. В частности, недопустимо напрямую выводить точки управления шейдера оболочки с помощью геометрического шейдера.

Использование Direct3D 11

Обзор Тесселлации