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


Спрайты точек (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 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 — это элемент Height структуры D3DVIEWPORT9 , представляющий окно просмотра. D ₑ, расстояние от глаза до позиции (глаз в источнике), вычисляется путем принятия положения в пространстве глаза точки (Xₑ, Yₑ, Zₑ) и выполнения следующей операции.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

Максимальный размер точки, Pmₐₓ, определяется меньшим элементом MaxPointSize структуры D3DCAPS9 или состоянием отрисовки D3DRS_POINTSIZE_MAX. Минимальный размер точки (Pmin) определяется запросом значения D3DRS_POINTSIZE_MIN. Таким образом, окончательный размер точки экранного пространства, S, определяется следующим образом.

  • Если Ss > Pmₐₓ, то S = P mₐₓ
  • если S < Pmin, то S = P min
  • В противном случае S = 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- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))

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

Назначение индексов текстур управляется параметром состояния отрисовки 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 на устройстве уровня аппаратной абстракции (D3DDEVTYPE_HAL), для которого элемент MaxPointSize структуры D3DCAPS9 имеет значение 1,0 или 0,0, то все точки представляют собой один пиксель. Для отрисовки спрайтов точек пикселей меньше 1,0 необходимо использовать вершины FVF TL (преобразованные и освещенные) или программную обработку вершин (D3DCREATE_SOFTWARE_VERTEXPROCESSING), в этом случае время выполнения Direct3D эмулирует отрисовку точечного спрайта.

Аппаратное устройство, которое выполняет обработку вершин и поддерживает точечные спрайты ( MaxPointSize, для параметра больше 1,0f), требуется для вычисления размера для нетрансформированных спрайтов и требуется для правильного задания каждой вершины или D3DRS_POINTSIZED3DRS_POINTSIZE для вершин TL.

Сведения о правилах отрисовки точек, линий и треугольников см. в разделе Правила растеризации (Direct3D 9).

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