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


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

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

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

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

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

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

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

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

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

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

По крайней мере наиболее распространенное использование пулов эффектов в Direct3D 10 было для группировки материалов. Пулы эффектов были удалены из Эффектов 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 { ... }

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

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

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

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

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

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

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

  • ХаллШейдер
  • DomainShader
  • ComputeShader

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

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

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 больше не управляет переменными блока состояния, а значения останутся неизменными. Обратите внимание, что поскольку блоки состояния неизменяемы, пользователь должен задать новый блок состояния, чтобы изменить значения.

Вы также можете вернуть буферы констант, буферы текстур и блоки состояния в управляемое состояние, отличное от пользователя. Если эти переменные не заданы, среда выполнения Effects 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 = ANISOTROPIC;

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

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

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

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

эффектов (Direct3D 11)