Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе показаны различия между эффектами 10 и эффектами 11.
Контексты устройств, потоки и клонирование
Интерфейс ID3D10Device разделен на два интерфейса в Direct3D 11: ID3D11Device и ID3D11DeviceContext. Можно создать несколько id3D11DeviceContexts, чтобы упростить параллельное выполнение в нескольких потоках. Эффекты 11 расширяют эту концепцию до платформы Эффектов.
Среда выполнения Effects 11 является однопоточной. По этой причине не следует использовать один экземпляр ID3DX11Effect с несколькими потоками одновременно.
Чтобы использовать среду выполнения Effects 11 в нескольких экземплярах, необходимо создать отдельные экземпляры ID3DX11Effect. Так как id3D11DeviceContext также является однопоточным, необходимо передать разные экземпляры ID3D11DeviceContext каждому экземпляру эффекта в Apply. Эти отдельные контексты устройств можно использовать для создания списков команд, чтобы поток отрисовки смог применить их к контексту немедленного устройства.
Самый простой способ создать несколько эффектов, которые инкапсулируют одну и ту же функциональность для использования в нескольких потоках, — создать один эффект, а затем создать клонированные копии. Клонирование имеет следующие преимущества при создании нескольких копий с нуля:
- Клонирование выполняется быстрее, чем процедура создания.
- Клонированные эффекты совместно используют созданные шейдеры, блоки состояния и экземпляры классов (поэтому их не нужно повторно создавать).
- Клонированные эффекты могут совместно использовать буферы констант.
- Клонированные эффекты начинаются с состояния, соответствующего текущему эффекту (значения переменных, независимо от того, оптимизировано ли оно).
Дополнительные сведения см. в клонирования эффекта.
Пулы эффектов и группы
По крайней мере наиболее распространенное использование пулов эффектов в 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 можно также сделать блоки состояния (состояние смешивания, состояние растеризатора, состояние элементов глубины и состояние образца) с помощью следующих вызовов:
- ID3DX11EffectBlendVariable::SetBlendState
- ID3DX11EffectRasterizerVariable::SetRasterizerState
- ID3DX11EffectDepthStencilVariable::SetDepthStencilState
- ID3DX11EffectSamplerVariable::SetSampler
После вызова этих функций среда выполнения Effects 11 больше не управляет переменными блока состояния, а значения останутся неизменными. Обратите внимание, что поскольку блоки состояния неизменяемы, пользователь должен задать новый блок состояния, чтобы изменить значения.
Вы также можете вернуть буферы констант, буферы текстур и блоки состояния в управляемое состояние, отличное от пользователя. Если эти переменные не заданы, среда выполнения Effects 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 = ANISOTROPIC;
Эти выражения могут отображаться в выражениях блока состояния (например, FILTER) и передавать выражения (например, SetPixelShader).
Доступность и расположение источника
Эффекты 10 были распределены в D3D10.dll. Эффекты 11 распределены как источник, с соответствующими решениями Visual Studio для компиляции. При создании приложений типа эффектов рекомендуется включить источник Effects 11 непосредственно в эти приложения.
Эффекты 11 можно получить из эффектов для обновления Direct3D 11.
Связанные разделы
-
эффектов (Direct3D 11)