Различия между эффектами 10 и эффектами 11

В этом разделе показаны различия между эффектами 10 и эффектами 11.

Контексты устройств, потоки и клонирование

Интерфейс ID3D10Device был разделен на два интерфейса в Direct3D 11: ID3D11Device и ID3D11DeviceContext. Вы можете создать несколько id3D11DeviceContexts, чтобы упростить параллельное выполнение в нескольких потоках. Effects 11 расширяет эту концепцию на платформу Эффекты.

Среда выполнения Effects 11 является однопоточной. По этой причине не следует использовать один экземпляр ID3DX11Effect с несколькими потоками одновременно.

Чтобы использовать среду выполнения Эффекты 11 на нескольких экземплярах, необходимо создать отдельные экземпляры ID3DX11Effect. Так как ID3D11DeviceContext также является однопоточным, необходимо передать разные экземпляры ID3D11DeviceContext в каждый экземпляр эффекта в Apply. Эти отдельные контексты устройств можно использовать для создания списков команд, чтобы поток отрисовки смог применить их к непосредственному контексту устройства.

Самый простой способ создать несколько эффектов, которые инкапсулируют одну и ту же функциональность для использования в нескольких потоках, — создать один эффект, а затем создать клонированные копии. Клонирование имеет следующие преимущества по сравнению с созданием нескольких копий с нуля.

  1. Процедура клонирования выполняется быстрее, чем процедура создания.
  2. Клонированные эффекты совместно используют созданные шейдеры, блоки состояний и экземпляры классов (поэтому их не нужно воссоздавать).
  3. Клонированные эффекты могут совместно использовать буферы констант.
  4. Клонированные эффекты начинаются с состояния, соответствующего текущему эффекту (значения переменных независимо от того, оптимизирован ли он или нет).

Дополнительные сведения см. в разделе Клонирование эффекта .

Пулы и группы эффектов

На сегодняшний день пулы эффектов в Direct3D 10 чаще всего используются для группирования материалов. Пулы эффектов были удалены из effects 11 и добавлены группы, что является более эффективным методом группировки материалов.

Группа эффектов — это просто набор методов. Дополнительные сведения см. в разделе Синтаксис группы эффектов (Direct3D 11).

Рассмотрим следующую иерархию эффектов с четырьмя дочерними эффектами и одним пулом эффектов:

// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }

// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }

// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }

// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }

Вы можете реализовать те же функции в эффекте 11 с помощью групп:

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

Новые этапы шейдера

В Direct3D 11 есть три новых этапа шейдера: шейдер корпуса, шейдер предметной области и шейдер вычислений. Эффекты 11 обрабатывают их аналогично вершинным шейдерам, геометрическим шейдерам и пиксельным шейдерам.

В эффекты 11 добавлены три новых типа переменных:

  • HullShader
  • DomainShader
  • ComputeShader

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

Новые типы текстур

Direct3D 11 поддерживает следующие типы текстур:

Неупорядоченные представления доступа

Эффекты 11 поддерживают получение и настройку новых типов представлений неупорядоченного доступа. Это работает так же, как и текстуры.

Рассмотрим этот пример эффектов HLSL:

  
RWTexture1D<float> myUAV;

Эту переменную в C++ можно задать следующим образом:

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11 поддерживает следующие типы представлений неупорядоченного доступа:

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Интерфейсы и экземпляры классов

Сведения об интерфейсе и синтаксисе классов см. в разделе Интерфейсы и классы.

Сведения об использовании интерфейсов и классов в эффектах см. в разделе Интерфейсы и классы в эффектах.

Адресируемый поток

В Direct3D 10 геометрические шейдеры могут выводить один поток данных в единицу вывода потока и в единицу растеризатора. В Direct3D11 геометрические шейдеры могут выводить до четырех потоков данных в единицу вывода потока и не более одного из этих потоков в единицу растеризатора. Встроенная функция ConstructGSWithSO была обновлена с учетом этой новой функциональности.

Дополнительные сведения см. в разделе Синтаксис stream out .

Настройка и отмена настройки состояния устройства

В разделе Эффекты 10 можно сделать буферы констант и буферы текстуры управляемыми пользователем с помощью функций ID3D10EffectConstantBuffer::SetConstantBuffer и SetTextureBuffer . После вызова этих функций среда выполнения Effects 10 больше не управляет буфером констант или буфером текстуры, и пользователь должен заполнить данные с помощью интерфейса ID3D10Device.

В эффектах 11 можно также сделать блоки состояний (состояние смешения, состояние растеризатора, состояние трафарета глубины и состояние выборки) пользователем, используя следующие вызовы:

После вызова этих функций среда выполнения Effects 11 больше не управляет переменными блока состояния, и значения останутся неизменными. Обратите внимание, что поскольку блоки состояний являются неизменяемыми, пользователь должен задать новый блок состояния, чтобы изменить значения.

Вы также можете отменить изменения буферы констант, буферы текстур и блоки состояний в управляемое состояние, не относясь к пользователю. Если эти переменные не заданы, среда выполнения Эффекты 11 продолжит обновлять их при необходимости. Для отмены набора пользовательских управляемых переменных можно использовать следующие вызовы:

Виртуальная машина с эффектами

Эффекты виртуальной машины, которая вычисляла сложные выражения вне функций, удалены.

Следующие примеры сложных выражений не поддерживаются:

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i );
  3. FILTER = i + 2;

Поддерживаются следующие примеры несложных выражений:

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex — это переменная uint.
  4. FILTER = i;
  5. FILTER = АНИЗОТРОПНЫЙ;

Эти выражения могут отображаться в выражениях блока состояния (например, FILTER) и выражениях pass (например, SetPixelShader).

Доступность и расположение источника

Эффекты 10 были распространены в D3D10.dll. Эффекты 11 распространяются в качестве источника с соответствующими решениями Visual Studio для его компиляции. При создании приложений типа эффектов рекомендуется включать источник Эффектов 11 непосредственно в эти приложения.

Вы можете получить эффекты 11 из обновления Эффекты для Direct3D 11.

Эффекты (Direct3D 11)