Различия между эффектами 10 и эффектами 11
В этом разделе показаны различия между эффектами 10 и эффектами 11.
Контексты устройств, потоки и клонирование
Интерфейс ID3D10Device был разделен на два интерфейса в Direct3D 11: ID3D11Device и ID3D11DeviceContext. Вы можете создать несколько id3D11DeviceContexts, чтобы упростить параллельное выполнение в нескольких потоках. Effects 11 расширяет эту концепцию на платформу Эффекты.
Среда выполнения Effects 11 является однопоточной. По этой причине не следует использовать один экземпляр ID3DX11Effect с несколькими потоками одновременно.
Чтобы использовать среду выполнения Эффекты 11 на нескольких экземплярах, необходимо создать отдельные экземпляры ID3DX11Effect. Так как ID3D11DeviceContext также является однопоточным, необходимо передать разные экземпляры ID3D11DeviceContext в каждый экземпляр эффекта в Apply. Эти отдельные контексты устройств можно использовать для создания списков команд, чтобы поток отрисовки смог применить их к непосредственному контексту устройства.
Самый простой способ создать несколько эффектов, которые инкапсулируют одну и ту же функциональность для использования в нескольких потоках, — создать один эффект, а затем создать клонированные копии. Клонирование имеет следующие преимущества по сравнению с созданием нескольких копий с нуля.
- Процедура клонирования выполняется быстрее, чем процедура создания.
- Клонированные эффекты совместно используют созданные шейдеры, блоки состояний и экземпляры классов (поэтому их не нужно воссоздавать).
- Клонированные эффекты могут совместно использовать буферы констант.
- Клонированные эффекты начинаются с состояния, соответствующего текущему эффекту (значения переменных независимо от того, оптимизирован ли он или нет).
Дополнительные сведения см. в разделе Клонирование эффекта .
Пулы и группы эффектов
На сегодняшний день пулы эффектов в 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 можно также сделать блоки состояний (состояние смешения, состояние растеризатора, состояние трафарета глубины и состояние выборки) пользователем, используя следующие вызовы:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
После вызова этих функций среда выполнения Effects 11 больше не управляет переменными блока состояния, и значения останутся неизменными. Обратите внимание, что поскольку блоки состояний являются неизменяемыми, пользователь должен задать новый блок состояния, чтобы изменить значения.
Вы также можете отменить изменения буферы констант, буферы текстур и блоки состояний в управляемое состояние, не относясь к пользователю. Если эти переменные не заданы, среда выполнения Эффекты 11 продолжит обновлять их при необходимости. Для отмены набора пользовательских управляемых переменных можно использовать следующие вызовы:
- ID3DX11EffectConstantBuffer::UndoSetConstantBuffer
- ID3DX11EffectConstantBuffer::UndoSetTextureBuffer
- ID3DX11EffectBlendVariable::UndoSetBlendState
- ID3DX11EffectRasterizerVariable::UndoSetRasterizerState
- ID3DX11EffectDepthStencilVariable::UndoSetDepthStencilState
- ID3DX11EffectSamplerVariable::UndoSetSampler
Виртуальная машина с эффектами
Эффекты виртуальной машины, которая вычисляла сложные выражения вне функций, удалены.
Следующие примеры сложных выражений не поддерживаются:
- SetPixelShader( myPSArray( i * 3 + j ) );
- SetPixelShader( myPSArray( (float)i );
- FILTER = i + 2;
Поддерживаются следующие примеры несложных выражений:
- SetPixelShader( myPS );
- SetPixelShader( myPS[i] );
- SetPixelShader( myPS[ uIndex ] ); uIndex — это переменная uint.
- FILTER = i;
- FILTER = АНИЗОТРОПНЫЙ;
Эти выражения могут отображаться в выражениях блока состояния (например, FILTER) и выражениях pass (например, SetPixelShader).
Доступность и расположение источника
Эффекты 10 были распространены в D3D10.dll. Эффекты 11 распространяются в качестве источника с соответствующими решениями Visual Studio для его компиляции. При создании приложений типа эффектов рекомендуется включать источник Эффектов 11 непосредственно в эти приложения.
Вы можете получить эффекты 11 из обновления Эффекты для Direct3D 11.
Связанные темы