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


Плоскости клипов пользователей на аппаратном уровне 9

Начиная с Windows 8, язык шейдеров высокого уровня Майкрософт (HLSL) поддерживает синтаксис, который можно использовать с API Microsoft Direct3D 11 для указания плоскостей клипов пользователей на уровне компонентов 9_x и выше. Этот синтаксис клип-плоскостей можно использовать для записи шейдера, а затем использовать этот объект шейдера с API Direct3D 11 для выполнения на всех уровнях функций Direct3D.

Фон

Вы можете получить доступ к плоскостям клипов пользователей в API Microsoft Direct3D 9 с помощью методов IDirect3Device9::SetClipPlane и IDirect3Device9::GetClipPlane. В Microsoft Direct3D 10 и более поздних версиях можно получить доступ к плоскостям клипов пользователей с помощью семантики SV_ClipDistance. Но до Windows 8 SV_ClipDistance не было доступно для уровня компонентов 9_x оборудования в API Direct3D 10 или Direct3D 11. Таким образом, до Windows 8 единственный способ доступа к плоскостям клипов пользователей с уровнем компонентов 9_x оборудованием было через API Direct3D 9. Приложения Магазина Windows Direct3D не могут использовать API Direct3D 9. Здесь описан синтаксис, который можно использовать для доступа к плоскостям клипов пользователей через API Direct3D 11 на уровне компонентов 9_x и более поздних версий.

Приложения используют плоскости клипов для определения набора невидимых плоскостей в трехмерном мире, который клип (выбросывает) все рисуемые примитивы. Windows не рисует ни одного пикселя, который находится на отрицательной стороне каких-либо плоскостей клипа. Затем приложения могут использовать плоскости клипов для отрисовки плановых отражений.

Синтаксис

Этот синтаксис используется для объявления плоскостей клипов в качестве атрибутов функции в объявлении функции . Например, здесь используется синтаксис фрагмента шейдера вершин:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

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

Заметка

Синтаксис недоступен для динамического отключения плоскости клипа. Необходимо либо перекомпилировать шейдер без клиппланов атрибутов, либо приложение может задать коэффициенты в буфере констант равным нулю, чтобы плоскость больше не влияла на геометрию.

 

Этот синтаксис доступен для любого целевого объекта шейдера вершин 4.0 или более поздней версии, включая vs_4_0_level_9_1 и vs_4_0_level_9_3.

Создание плоскостей клипов в пространстве клипов на уровне 9 и выше

Здесь показано, как создавать плоскости клипов в пространстве клипов на уровне компонентов 9_x и выше.

Фоновое чтение

"Введение в трехмерное игровое программирование с DirectX 10" Фрэнк Д. Луна объясняет графический математический фон (главы 1, 2 и 3), необходимые, а также различные пространства и преобразования пространства, которые происходят в шейдере вершин (разделы 5.6 и 5.8).

Уровни компонентов 10Level9

В Direct3D 10 и более поздних версиях вы можете клип в любом пространстве, которое имеет смысл, часто в пространстве мира или в пространстве просмотра. Но Direct3D 9 использует пространство клипа, которое предварительно разделяет пространство проекции. Векторы находятся в пространстве клипа, когда вершинный шейдер передает их на этапы, которые следуют за графическим конвейером.

При написании приложения Магазина Windows необходимо использовать уровни компонентов 10Level9 (уровне компонентов 9_x), чтобы приложение лось на уровне компонентов 9_x и более высоком оборудовании. Так как приложение поддерживает уровень функций 9_x и выше, необходимо также использовать общую возможность применения плоскостей клипов в пространстве клипов.

При компиляции шейдера вершин с vs_4_0_level_9_1 или более поздней версии этот шейдер вершин может использовать клиппланы атрибут. Объект Direct3D 10 или более поздней версии имеет точку продукта генерируемой вершины, которая содержит каждую из float4 глобальных констант, указанных в атрибуте. Объект Direct3D 9 имеет достаточно метаданных, чтобы среда выполнения 10Level9 выдает соответствующие вызовы для IDirect3Device9::SetClipPlane.

Математика плоскости клипа

Плоскость клипа определяется вектором с 4 компонентами. Первые три компонента определяют вектор x, y, z, исходящий из источника в пространстве, который мы хотим обрезать. Этот вектор подразумевает плоскость, перпендикулярную к вектору и выполняющуюся через источник. Windows сохраняет все пиксели на векторной стороне плоскости и обрезает все пиксели за плоскости. Дополнительный компонент w отправляет плоскость обратно и приводит к тому, что Windows будет меньше (отрицательный w приводит к тому, что Windows больше обрезает) вдоль векторной линии. Если x, y, компоненты z составляют вектор единицы (нормализовано), w отправляет единицы w единиц назад.

Математика, которую выполняет модуль обработки графики (GPU) для определения вырезки является простым продуктом точки между вектором вершин (x, y, z, 1) и вектором отрезки плоскости. Эта математические операции создает длину проекции в векторе плоскости клипа. Отрицательный продукт точки показывает вершину, чтобы быть на обрезанной стороне плоскости.

Вырезка в пространстве представления

Вот наша вершина в пространстве представления:

вершины в пространстве представления

Вот наш плоскость клипа в пространстве представления:

плоскости клипа в пространстве представления

Вот точка продукта вершины и плоскости клипа в пространстве представления:

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Эта математические операции работают для объекта Direct3D 10 или более поздней версии, но не будут работать для объекта Direct3D 9. Для Direct3D 9 мы должны сначала пройти через преобразование проекции в пространство клипов.

Проекционная матрица

Матрица проекции преобразует вершину из пространства представления (где источник является глазом средства просмотра, +x справа, +y вверх, и +z прямо вперед) в пространство клипа. Матрица проекции считывает вершину для аппаратного вырезки и этапа растеризации. Ниже приведена стандартная матрица перспективы (для других проекций требуется другая математика):

*r* соотношение ширины окна и высоты *α* угол просмотра *f* расстояние от зрителя к дальней плоскости *n* расстояние от средства просмотра до близкого плоскости
! [матрица проекции](изображения/projection-matrix.png)

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

упрощенной матрицы проекции

Теперь мы преобразуем вершину пространства представления в пространство клипа с умножением матрицы:

матрица умножает

В нашей матрице умножаются компоненты x и y только немного скорректированы, но наши компоненты z и w довольно сложены. Наш самолет клипа больше не даст нам то, что мы хотим больше.

Плоскость клипов

Здесь мы хотим создать плоскость клипового пространства, точка продукта с вершиной пространства клипа дает нам то же значение, что и v · C в разделе Обрезка в пространстве представления.

плоскости клипа

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw

Теперь можно разбить предыдущую математические операции по компоненту вершины на четыре отдельных уравнения:

компонент вершины продукта плоскости клипа

компонент вершины продукта плоскости клипа

компонент вершины продукта плоскости клипа

z компонента вершины продукта плоскости клипа

Наш плоскость клипов представления и матрица проекции являются производными и дают нам наш плоскость клипового пространства.

плоскости клипового пространства

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

синтаксис объявления функции