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


Использование минимальной точности HLSL

Начиная с Windows 8, графические драйверы могут реализовывать скалярные типы данных HLSL с минимальной точностью, используя любую точность, превышающую или равную заданной битовой точности. Если код шейдера минимальной точности HLSL используется на оборудовании, которое реализует минимальную точность HLSL, вы используете меньшую пропускную способность памяти и в результате используете меньше энергии системы.

Вы можете запросить поддержку минимальной точности, которую предоставляет графический драйвер, вызвав ID3D11Device::CheckFeatureSupport с D3D11_FEATURE_SHADER_MIN_PRECISION_SUPPORT значением. Дополнительные сведения см. в разделе Поддержка минимальной точности HLSL.

Объявление переменных с типами данных минимальной точности

Чтобы использовать минимальную точность в коде шейдера HLSL, объявите отдельные переменные с такими типами, как min16float (min16float4 для вектора), min16int, min10float и т. д. При использовании этих переменных код шейдера указывает на то, что ему не требуется более точное значение, чем указано в переменных. Но оборудование может игнорировать индикаторы минимальной точности и работать с полной 32-разрядной точностью. При использовании кода шейдера на оборудовании, которое использует преимущества минимальной точности, вы используете меньшую пропускную способность памяти и в результате используете меньше энергии системы, если код шейдера не ожидает большей точности, чем указано.

Вам не нужно создавать несколько шейдеров, которые выполняют и не используют минимальную точность. Вместо этого создайте шейдеры с минимальной точностью, а переменные минимальной точности работают с полной 32-разрядной точностью, если графический драйвер сообщает, что он не поддерживает минимальную точность. Шейдеры минимальной точности HLSL не работают в операционных системах раньше, чем Windows 8 поэтому, если вы планируете использовать более ранние операционные системы, вам потребуется создать несколько шейдеров, одни из которые делают, а другие не используют минимальную точность.

Примечание

Не переключайте данные между разными уровнями точности в шейдере, так как такие преобразования являются расточительными и снижают производительность. Исключением является то, что константы шейдера по-прежнему всегда являются 32-разрядными, но поставщики могут разработать графическое оборудование, которое может свободно преобразовывать вниз до любой более низкой точности, которую может использовать чтение инструкций HLSL.

 

С помощью минимальной точности можно управлять точностью вычислений в различных частях кода шейдера.

Правила минимальной точности HLSL аналогичны C/C++, где типы в выражении определяют точность операции, а не тип, в который в конечном итоге записывается.

Тестирование кода шейдера минимальной точности

Средство растеризации ссылок (D3D_DRIVER_TYPE_REFERENCE) дает приблизительное представление о том, как работает минимальная точность в коде шейдера HLSL путем квантования каждой инструкции HLSL до указанной точности. Это помогает обнаружить код, который может случайно полагаться на большую точность, чем минимальная. Средство растеризатора ссылок не выполняется быстрее, если код шейдера HLSL использует минимальную точность, но его можно использовать для проверки правильности кода. WARP (D3D_DRIVER_TYPE_WARP) не поддерживает использование минимальной точности в коде шейдера HLSL; WARP просто выполняется с полной 32-разрядной точностью.

Руководство по программированию для HLSL