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


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)

Это показано на следующей схеме.

диаграмме квадрата с помеченными вершинами для значений координат (u,v) и (x,y)

Если вырезка включена, точки обрезаются следующим образом. Если вершина превышает диапазон значений глубины — 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).

конвейер вершин