DX10 – новые возможности и вопросы производительности Юрий Уральский, NVIDIA
Copyright © NVIDIA Corporation 2005 DX10 Много новой функциональности Не только геометрические шейдеры Возможность перестроить ваш графический движок Мотивация к созданию новых эффектов
Copyright © NVIDIA Corporation 2005 Outline D3D10 API Ресурсы и представления Инстансинг Геометрические шейдеры и stream out Массивы текстур и другие возможности
Copyright © NVIDIA Corporation > 9 ! Новый, компактный API Меньше HRESULT, больше void Стейт-объекты Новая модель драйвера Позволяет значительно сократить CPU overhead Виртуализация ресурсов Больше нет lost devices! Новый уровень программируемости Унифицированные шейдеры (SM 4.0)
Copyright © NVIDIA Corporation 2005 D3D9 Вершинный шейдер Видеопамять Текстуры/RT VB/IB Сборка примитивов Растеризация Пиксельный шейдер Операции с буфером кадра
Copyright © NVIDIA Corporation 2005 D3D10 Вершинный шейдер Видеопамять Сборка примитивов Растеризация Пиксельный шейдер Операции с буфером кадра
Copyright © NVIDIA Corporation 2005 D3D10 Вершинный шейдер Видеопамять Сборка примитивов Растеризация Пиксельный шейдер Операции с буфером кадра Input Assembler (IA)
Copyright © NVIDIA Corporation 2005 D3D10 Вершинный шейдер Видеопамять Растеризация Пиксельный шейдер Операции с буфером кадра Input Assembler (IA) Геометрический шейдер
Copyright © NVIDIA Corporation 2005 D3D10 Вершинный шейдер Видеопамять Растеризация Пиксельный шейдер Операции с буфером кадра Input Assembler (IA) Геометрический шейдер Stream Out
Copyright © NVIDIA Corporation 2005 D3D10 API ID3D10Device::IA… Input Assembler ID3D10Device::VS… Vertex Shader ID3D10Device::GS… Geometry Shader ID3D10Device::SO… Stream Output ID3D10Device::RS… Rasterizer Stage ID3D10Device::PS… Pixel Shader ID3D10Device::OM… Output Merger
Copyright © NVIDIA Corporation 2005 Забудьте про CapsBits! Вся функциональность всегда присутствует Большинство форматов всегда поддерживается есть исключения блендинг RGB32F Поддержка форматов проверяется вызовом ID3D10Device::CheckFormatSupport
Copyright © NVIDIA Corporation 2005 Настройка конвейера D3D10 Настройки конвейера сгруппированы в стейт- объекты Больше нет SetRenderState(…) Драйвер может эффективно кэшировать состояния конвейера 4096 стейт-объектов каждого типа ID3D10Device ID3D10InputLayout ID3D10RasterizerState ID3D10DepthStencilState ID3D10BlendState ID3D10SamplerState
Copyright © NVIDIA Corporation 2005 Ресурсы D3D10 Буферы ~Последовательный доступ Элементы могут быть разного типа/размера Текстуры Произвольный доступ Состоят из суб-ресурсов Тип элементов указывать необязательно Виртуализированы OS ID3D10Buffer ID3D10Texture1D ID3D10Texture2D ID3D10Texture3D ID3D10TextureCube ID3D10Resource
Copyright © NVIDIA Corporation 2005 Типы доступа к ресурсам D3D10_USAGE_DEFAULT Обновляется редко, маппинг невозможен D3D10_USAGE_DYNAMIC Обновляется часто, CPU имеет прямой доступ D3D10_USAGE_IMMUTABLE Никогда не обновляется D3D10_USAGE_STAGING Используется для получения данных из GPU
Copyright © NVIDIA Corporation 2005 Представления (view) Позволяют по-разному интерпретировать данные в ресурсах Рендеринг в VB/IB Рендеринг в константы шейдера Использование stencil-буфера как текстуры Позволяют получить доступ к суб-ресурсам Рендеринг в отдельные mip-уровни ID3D10ShaderResourceView ID3D10RenderTargetView ID3D10DepthStencilView
Copyright © NVIDIA Corporation 2005 Методы Draw() в D3D10 Draw(…) DrawInstanced(…) DrawIndexed(…) DrawIndexedInstanced(…) DrawAuto(…) Используется вместе с StreamOut
Copyright © NVIDIA Corporation 2005 Инстансинг в D3D10 Полноценная поддержка в API Рендеринг без инстансинга – просто частный случай Другие возможности D3D10 делают инстансинг еще более полезным Геометрические шейдеры Массивы текстур Stream Out Instance ID (x 0 y 0 z 0 ) (n x0 n y0 n z0 ) (x 1 y 1 z 1 ) (n x1 n y1 n z1 ) … (x 99 y 99 z 99) (n x99 n y99 n z99 ) 0 1 … Вершины worldMatrix 0 worldMatrix 1 … worldMatrix … Атрибуты объектов
Copyright © NVIDIA Corporation 2005 Геометрический шейдер (GS) Программируемость на этапесборки примитивов Можно создавать новые примитивы! Имеет доступ к соседним примитивам Может использовать семантику SV_PrimitiveID Triangles with adjacency Lines with adjacency
Copyright © NVIDIA Corporation 2005 Геометрический шейдер (GS) [MaxVertexCount(10)] void GS_Simple(lineadj VSOut In[4], inout TriangleStream Stream) { GSOut v; … Stream.Append(v); … Stream.Append(v); … Stream.RestartStrip(); … Stream.Append(v); }
Copyright © NVIDIA Corporation 2005 Примеры использования GS Генерирование shadow volume на лету Определяем ребра силуэта, генерируем грани Motion Blur Считаем локальные скорости, генерируем дополнительную геометрию Изо-поверхности на GPU GDC06, Practical Metaballs and Isosurfaces
Copyright © NVIDIA Corporation 2005 Геометрический шейдер (GS) Количество выходных атрибутов ограничено Максимум скалярных атрибута в D3D10 Не используйте для тесселяции! Старайтесь не использовать большие значения MaxVertexCount
Copyright © NVIDIA Corporation 2005 Stream Out Возможность записи результатов работы GS в вершинный буфер Или VS если GS отсутствует Всегда выводятся списки примитивов Дает возможность повторно использовать результаты работы GS/VS Вершинный шейдер Видеопамять Растеризация Пиксельный шейдер Операции с буфером кадра Input Assembler (IA) Геометрический шейдер Stream Out
Copyright © NVIDIA Corporation 2005 Массивы текстур Могут быть динамически индексированы из шейдеров Текстуры для инстанцируемых объектов SV_InstanceID можно использовать в качестве индекса
Copyright © NVIDIA Corporation 2005 Рендеринг в массив текстур Массивы текстур могут использоваться как RT через ID3D10RenderTargetView В GS переменная с семантикой SV_RenderTargetArrayIndex определяет индекс render-текстуры в массиве Можно использовать для рендеринга в cubemap в одном прохоже Не то же самое, что MRT! Каждый примитив из GS проходит растеризацию и PS
Copyright © NVIDIA Corporation 2005 Прощай, Fixed Function! Нет тумана......Эмулируем в VS/PS Нет point-спрайтов......Используйте GS для создания геометрии Нет плоскостей отсечения......Используйте семантику SV_ClipDistance[n] в VS/GS Нет альфа теста!...Используйте инструкцию clip() в пиксельном шейдере См. пример FixedFuncEMU в DX10 SDK
Copyright © NVIDIA Corporation 2005 Предикативный рендеринг Условное выполнение вызовов Draw() Без остановки конвейера... по результату occlusion query Эффективный occlusion culling... при переполнении буфера stream out
Copyright © NVIDIA Corporation 2005 Предикативный рендеринг m_pPredicateQuery->Begin(); //… // Здесь рисуем простую геометрию //… m_pPredicateQuery->End(NULL); pD3D10Device->SetPredication(m_pPredicateQuery, FALSE); //… // Здесь рисуем сложную геометрию //… // отключаем предикативный рендеринг pD3D10Device->SetPredication(NULL, FALSE);
Copyright © NVIDIA Corporation 2005 Заключение DX10 – большой шаг вперед в функциональности и гибкости Начинайте изучать DX10 уже сегодня! Документация/примеры в февральском DX9 SDK
Copyright © NVIDIA Corporation 2005 Наши следующие лекции 16:00 – 16:50Инструменты для разработчиков от NVIDIA Raul Aguaviva/Филипп Герасимов 17:00 – 18:00Расчет физики на GPU Simon Green
Copyright © NVIDIA Corporation 2005 Есть идеи? Пишите -