Punkt-Sprites (Direct3D 9)

Die Unterstützung für Punktsprites in Direct3D 9 ermöglicht das hochleistungsfähige Rendering von Punkten (Partikelsystemen). Punktspites sind Generalisierungen generischer Punkte, die es ermöglichen, beliebige Formen wie durch Texturen definiert zu rendern.

Point Primitive Rendering-Steuerelemente

Direct3D 9 unterstützt zusätzliche Parameter, um das Rendern von Punkt-Sprites (Punktgrundtypen) zu steuern. Mit diesen Parametern können Punkte eine variable Größe aufweisen und eine vollständige Texturzuordnung angewendet werden. Die Größe jedes Punkts wird durch eine anwendungsspezifische Größe in Kombination mit einer entfernungsbasierten Funktion bestimmt, die von Direct3D berechnet wird. Die Anwendung kann die Punktgröße entweder pro Scheitelpunkt oder durch Festlegen von D3DRS_POINTSIZE angeben, die für Punkte ohne Größe pro Scheitelpunkt gilt. Die Punktgröße wird in Kameraraumeinheiten ausgedrückt, mit Ausnahme, wenn die Anwendung nach der Transformation des flexiblen Vertexformats (FVF) Scheitelpunkte übergibt. In diesem Fall wird die entfernungsbasierte Funktion nicht angewendet, und die Punktgröße wird auf dem Renderziel in Pixeleinheiten ausgedrückt.

Die beim Rendern von Punkten berechneten und verwendeten Texturkoordinaten hängen von der Einstellung von D3DRS_POINTSPRITEENABLE ab. Wenn dieser Wert auf TRUE festgelegt ist, werden die Texturkoordinaten so festgelegt, dass jeder Punkt die vollständige Textur anzeigt. Im Allgemeinen ist dies nur nützlich, wenn Punkte deutlich größer als ein Pixel sind. Wenn D3DRS_POINTSPRITEENABLE auf FALSE festgelegt ist, wird die Vertextexturkoordinate jedes Punkts für den gesamten Punkt verwendet.

Punktgrößenberechnungen

Die Punktgröße wird durch D3DRS_POINTSCALEENABLE bestimmt. Wenn dieser Wert auf FALSE festgelegt ist, wird die von der Anwendung angegebene Punktgröße als Bildschirmraumgröße (nach der Transformation) verwendet. Für Scheitelpunkte, die im Bildschirmbereich an Direct3D übergeben werden, werden keine Punktgrößen berechnet. Die angegebene Punktgröße wird als Bildschirmraumgröße interpretiert.

Wenn D3DRS_POINTSCALEENABLE TRUE ist, berechnet Direct3D die Größe des Bildschirmraumpunkts gemäß der folgenden Formel. Die von der Anwendung angegebene Punktgröße wird in Kameraraumeinheiten ausgedrückt.

S s = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² )))

In dieser Formel ist die Größe des Eingabepunkts S i entweder pro Scheitelpunkt oder der Wert des D3DRS_POINTSIZE Renderzustands. Die Punktskalierungsfaktoren D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B und D3DRS_POINTSCALE_C werden durch die Punkte A, B und C dargestellt. Die Höhe des Viewports V h ist der Height-Member der D3DVIEWPORT9-Struktur , der den Viewport darstellt. D ₑ, der Abstand zwischen dem Auge und der Position (dem Auge am Ursprung), wird berechnet, indem die Augenraumposition des Punkts (Xₑ, Yₑ, Zₑ) und die folgende Operation durchgeführt wird.

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

Die maximale Punktgröße Pmₐₓ wird bestimmt, indem entweder der kleinere des MaxPointSize-Elements der D3DCAPS9-Struktur oder der D3DRS_POINTSIZE_MAX Renderzustand verwendet wird. Die minimale Punktgröße Pmin wird durch Abfragen des Werts von D3DRS_POINTSIZE_MIN bestimmt. Somit wird die endgültige Größe des Bildschirmraumpunkts, S, wie folgt bestimmt.

  • Wenn Ss > Pmₐₓ, dann S = P mₐₓ
  • wenn S < Pmin, dann S = P min
  • Andernfalls ist S = S s

Punktrendering

Ein Bildschirmraumpunkt P = ( X, Y, Z, W) der Bildschirmraumgröße S wird als Viereck der folgenden vier Scheitelpunkte gerastert.

(( 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))

Die Vertexfarbattribute werden an jedem Scheitelpunkt dupliziert. Daher wird jeder Punkt immer mit konstanten Farben gerendert.

Die Zuweisung von Texturindizes wird durch die Einstellung D3DRS_POINTSPRITEENABLE Renderzustand gesteuert. Wenn D3DRS_POINTSPRITEENABLE auf FALSE festgelegt ist, werden die Vertextexturkoordinaten an jedem Scheitelpunkt dupliziert. Wenn D3DRS_POINTSPRITEENABLE auf TRUE festgelegt ist, werden die Texturkoordinaten an den vier Scheitelpunkten auf die folgenden Werte festgelegt.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Dies wird im folgenden Diagramm veranschaulicht:

Diagramm eines Quadrats mit bezeichneten Scheitelpunkten für (u,v) und (x,y) Koordinatenwerte

Wenn das Beschneiden aktiviert ist, werden Punkte wie folgt abgeschnitten. Wenn der Scheitelpunkt den Bereich der Tiefenwerte (MinZ und MaxZ) der D3DVIEWPORT9-Struktur überschreitet, in die eine Szene gerendert werden soll, liegt der Punkt außerhalb des Ansichts frustums vor und wird nicht gerendert. Wenn der Punkt unter Berücksichtigung der Punktgröße vollständig außerhalb des Viewports in X und Y liegt, wird der Punkt nicht gerendert. die verbleibenden Punkte werden gerendert. Es ist möglich, dass sich die Punktposition außerhalb des Viewports in X oder Y befindet und weiterhin teilweise sichtbar ist.

Punkte können auf benutzerdefinierten Clipebenen ordnungsgemäß abgeschnitten werden. Wenn D3DPMISCCAPS_CLIPPLANESCALEDPOINTS im PrimitiveMiscCaps-Element der D3DCAPS9-Struktur nicht festgelegt ist, werden Punkte auf benutzerdefinierte Clipebenen nur basierend auf der Vertexposition abgeschnitten, wobei die Punktgröße ignoriert wird. In diesem Fall werden skalierte Punkte vollständig gerendert, wenn sich die Vertexposition innerhalb der Clipebenen befindet, und verworfen, wenn sich die Vertexposition außerhalb einer Clipebene befindet. Anwendungen können potenzielle Artefakte verhindern, indem sie eine Rahmengeometrie zu Clipebenen hinzufügen, die so groß ist wie die maximale Punktgröße.

Wenn das D3DPMISCCAPS_CLIPPLANESCALEDPOINTS Bits festgelegt ist, werden die skalierten Punkte ordnungsgemäß auf benutzerdefinierte Clipebenen abgeschnitten.

Die Hardwarevertexverarbeitung unterstützt möglicherweise die Punktgröße. Wenn beispielsweise ein Gerät mit D3DCREATE_HARDWARE_VERTEXPROCESSING auf einem HAL-Gerät (Hardware Abstraction Layer) (D3DDEVTYPE_HAL) erstellt wird, auf dem das MaxPointSize-Element der D3DCAPS9-Struktur auf 1.0 oder 0.0 festgelegt ist, sind alle Punkte ein einzelnes Pixel. Um Pixelpunkt-Sprites kleiner als 1,0 zu rendern, müssen Sie entweder FVF-TL-Scheitelpunkte (transformiert und beleuchtet) oder Softwarevertexverarbeitung (D3DCREATE_SOFTWARE_VERTEXPROCESSING) verwenden. In diesem Fall emuliert die Direct3D-Laufzeit das Punktsprite-Rendering.

Ein Hardwaregerät, das die Vertexverarbeitung durchführt und Punktsprites unterstützt – MaxPointSize ist auf größer als 1,0f festgelegt – ist erforderlich, um die Größenberechnung für nicht transformierte Sprites durchzuführen, und muss die einzelnen Scheitelpunkte oder D3DRS_POINTSIZED3DRS_POINTSIZE für TL-Scheitelpunkte ordnungsgemäß festlegen.

Informationen zu Renderingregeln für Punkte, Linien und Dreiecke finden Sie unter Rasterungsregeln (Direct3D 9).

Vertexpipeline