Sprites point (Direct3D 9)
Поддержка спрайтов точек в Direct3D 9 обеспечивает высокую производительность отрисовки точек (систем частиц). Спрайты точек — это обобщение универсальных точек, которые позволяют отрисовывать произвольные фигуры в соответствии с текстурами.
- элементов управления точечной отрисовки
- вычисления размера точки
- отрисовки точек
Элементы управления "Примитивная отрисовка точек"
Direct3D 9 поддерживает дополнительные параметры для управления отрисовкой спрайтов точек (примитивов точек). Эти параметры позволяют точкам иметь размер переменной и применять полную схему текстур. Размер каждой точки определяется заданным приложением размером в сочетании с функцией на основе расстояния, вычисляемой Direct3D. Приложение может указать размер точки в виде вершины или задать D3DRS_POINTSIZE, которая применяется к точкам без размера вершины. Размер точки выражается в единицах пространства камеры, за исключением случаев, когда приложение передает вершины после преобразования гибкой вершины (FVF). В этом случае функция на основе расстояния не применяется, а размер точки выражается в единицах пикселей в целевом объекте отрисовки.
Текстура координаты вычисляется и используется, когда точки отрисовки зависят от параметра D3DRS_POINTSPRITEENABLE. Если для этого значения задано значение TRUE, координаты текстуры задаются таким образом, чтобы каждая точка отображала всю текстуру. Как правило, это полезно только в том случае, если точки значительно больше одного пикселя. Если D3DRS_POINTSPRITEENABLE задано значение FALSE, координата текстуры вершин каждой точки используется для всей точки.
Вычисления размера точек
Размер точки определяется D3DRS_POINTSCALEENABLE. Если для этого значения задано значение FALSE, размер указанной приложением точки используется в качестве размера пространства экрана (после преобразования). Вершины, передаваемые в Direct3D в пространстве экрана, не имеют размеров точек; указанный размер точки интерпретируется как размер пространства экрана.
Если D3DRS_POINTSCALEENABLE TRUE, Direct3D вычисляет размер точки пространства экрана в соответствии со следующей формулой. Указанный приложением размер точки выражается в единицах пространства камеры.
S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ )))
В этой формуле размер входной точки , S i, является либо вершиной, либо значением состояния отрисовки D3DRS_POINTSIZE. Коэффициенты масштабирования точек, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B и D3DRS_POINTSCALE_C представлены точками A, B и C. Высота окна просмотра ( V h) — это элемент D3DVIEWPORT9 структуры высоты, представляющий окно просмотра. D ₑ, расстояние от глаза к позиции (глаз в источнике), вычисляется путем принятия положения пространства глаза точки (Xₑ, Yₑ, Zₑ) и выполнения следующей операции.
D ₑ = sqrt (Xₑ² + Y ₑ ₑ + Z ₑ ͅͅ);
Максимальный размер точки Pmₐₓ определяется путем принятия меньшего размера элемента maxPointSize структуры D3DCAPS9 или состояния D3DRS_POINTSIZE_MAX отрисовки. Минимальный размер точки Pминопределяется запросом значения D3DRS_POINTSIZE_MIN. Таким образом, окончательный размер точки пространства экрана, S, определяется следующим образом.
- Если Ss > Pmₐₓ, то S = P mₐₓ
- Значение S < Pмин, то S = P мин
- В противном случае S = S
Отрисовка точек
Точка пространства экрана, P = ( X, Y, Z, W) размера экрана S растровая как четырехсторонняя из следующих четырех вершин.
(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y/2, Z, W), ( X - S/2, Y + S/2, Z))
Атрибуты цвета вершин дублируются на каждой вершине; Таким образом, каждая точка всегда отображается с константными цветами.
Назначение индексов текстур управляется параметром состояния отображения D3DRS_POINTSPRITEENABLE. Если D3DRS_POINTSPRITEENABLE установлено значение FALSE, координаты текстур вершин дублируются на каждой вершине. Если D3DRS_POINTSPRITEENABLE задано значение TRUE, то координаты текстуры на четырех вершинах задаются следующими значениями.
(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)
Это показано на следующей схеме.
Если вырезка включена, точки обрезаются следующим образом. Если вершина превышает диапазон значений глубины — MinZ и MaxZ структуры D3DVIEWPORT9 , в которой должна быть отрисовка сцены, точка существует вне представления frustum и не отображается. Если точка, учитывая размер точки, полностью выходит за пределы окна просмотра в X и Y, то точка не отображается; Остальные точки отрисовываются. Положение точки может находиться за пределами окна просмотра в X или Y и по-прежнему быть частично видимым.
Точки могут быть неправильно обрезанными к определяемым пользователем плоскостям клипов. Если D3DPMISCCAPS_CLIPPLANESCALEDPOINTS не заданы в члене структуры PrimitiveMiscCaps D3DCAPS9, точки обрезаются в определяемые пользователем плоскости клипов только на основе положения вершины, игнорируя размер точки. В этом случае масштабируемые точки полностью отрисовываются, когда позиция вершины находится внутри плоскостей клипа и удаляется, когда позиция вершины находится за пределами плоскости клипа. Приложения могут предотвратить потенциальные артефакты, добавив геометрию границы в плоскости клипа, размер которой превышает максимальный размер точки.
Если установлен D3DPMISCCAPS_CLIPPLANESCALEDPOINTS бит, то масштабируемые точки правильно обрезаются до определяемых пользователем плоскостей клипов.
Обработка вершин оборудования может или не поддерживает размер точки. Например, если устройство создается с D3DCREATE_HARDWARE_VERTEXPROCESSING на аппаратном уровне абстракции (HAL) устройства (D3DDEVTYPE_HAL), которое имеет элемент maxPointSize структуры D3DCAPS9 значение 1.0 или 0.0, то все точки являются одним пикселем. Чтобы отрисовка спрайтов точек пикселей меньше 1,0, необходимо использовать вершины FVF (преобразованные и освещенные) или программную обработку вершин (D3DCREATE_SOFTWARE_VERTEXPROCESSING), в этом случае время выполнения Direct3D эмулирует отрисовку спрайта точек.
Аппаратное устройство, которое выполняет обработку вершин и поддерживает спрайты точек — MaxPointSize, равное 1,0f, требуется для выполнения вычисления размера для нетрансформированных спрайтов и требуется для правильного задания вершин на каждую вершину или D3DRS_POINTSIZED3DRS_POINTSIZE для вершин TL.
Сведения о правилах отрисовки для точек, строк и треугольников см. в правила растеризации (Direct3D 9).
Связанные разделы