Point Sprites (Direct3D 9)

Die Unterstützung für Punkt-Sprites in Direct3D 9 ermöglicht das hochleistungsfähige Rendern von Punkten (Partikelsysteme). Punkt-Sprites sind Generalisierungen generischer Punkte, mit denen beliebige Formen wie durch Texturen gerendert werden können.

Point Primitive Rendering-Steuerelemente

Direct3D 9 unterstützt zusätzliche Parameter, um das Rendern von Punkt-Sprites (Punktgrundtypen) zu steuern. Diese Parameter ermöglichen, dass Punkte der Variablengröße entsprechen und eine vollständige Texturzuordnung angewendet wird. Die Größe jedes Punkts wird durch eine anwendungsspezifische Größe bestimmt, die mit einer abstandsbasierten Funktion kombiniert wird, die von Direct3D berechnet wird. Die Anwendung kann die Punktgröße entweder per Vertex oder durch Festlegen von D3DRS_POINTSIZE angeben, die für Punkte ohne Vertexgröße gilt. Die Punktgröße wird in Kameraraumeinheiten ausgedrückt, abgesehen davon, wann die Anwendung posttransformationierte flexible Vertexformate (FVF)-Scheitelpunkte übergibt. In diesem Fall wird die Abstandsfunktion nicht angewendet, und die Punktgröße wird in Einheiten von Pixeln im Renderziel ausgedrückt.

Die Texturkoordinaten, die beim Rendern von Punkten berechnet und verwendet werden, hängt 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 Vertextextkoordinate jedes Punkts für den gesamten Punkt verwendet.

Punktgrößesberechnungen

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 (posttransformationiert) verwendet. Scheitelpunkte, die an Direct3D im Bildschirmbereich übergeben werden, weisen keine berechneten Punktgrößen auf; Die angegebene Punktgröße wird als Bildschirmraumgröße interpretiert.

Wenn D3DRS_POINTSCALEENABLE WAHR ist, berechnet Direct3D die Größe des Bildschirmraumpunkts entsprechend der folgenden Formel. Die anwendungsspezifische Punktgröße wird in Kameraraumeinheiten ausgedrückt.

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

In dieser Formel ist die Eingabepunktgröße 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 das Height-Element der D3DVIEWPORT9-Struktur , das den Viewport darstellt. D ₑ, der Abstand vom Auge zur Position (das Auge am Ursprung), wird berechnet, indem die Augenraumposition des Punkts (Xₑ, Yₑ, Zₑ, Zₑ) und die folgende Operation ausgeführt wird.

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

Die maximale Punktgröße, Pmₐₓ, wird bestimmt, indem der kleinere teil des MaxPointS9-Elements der D3DCAPS9-Struktur oder des D3DRS_POINTSIZE_MAX Renderzustands verwendet wird. Die Mindestpunktgröße Pmin wird durch Abfragen des Werts von D3DRS_POINTSIZE_MIN bestimmt. Daher wird die endgültige Größe des Bildschirmraumpunkts S auf folgende Weise bestimmt.

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

Punktrendering

Ein Bildschirmraumpunkt, P = ( X, Y, Z, W), der Bildschirmraumgröße S wird als Quadrilateral 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 bei jedem Scheitelpunkt dupliziert; somit wird jeder Punkt immer mit Konstantenfarben gerendert.

Die Zuordnung von Texturindizes wird durch die D3DRS_POINTSPRITEENABLE Renderzustandseinstellung gesteuert. Wenn D3DRS_POINTSPRITEENABLE auf FALSE festgelegt ist, werden die Vertextextkoordinaten bei 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:

diagram of a square with labeled vertices for (u,v) and (x,y) coordinate values

Wenn clipping aktiviert ist, werden Punkte auf die folgende Weise abgeschnitten. Wenn der Scheitelpunkt den Bereich der Tiefenwerte überschreitet - MinZ und MaxZ der D3DVIEWPORT9-Struktur - in der eine Szene gerendert werden soll, ist der Punkt außerhalb des Ansichts frustum vorhanden 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 immer noch teilweise sichtbar ist.

Punkte können nicht ordnungsgemäß auf benutzerdefinierte Clipebenen zugeschnitten werden. Wenn D3DPMISCCAPS_CLIPPLANESCALEDPOINTS nicht im PrimitiveMiscCaps-Element der D3DCAPS9-Struktur festgelegt ist, werden Punkte auf benutzerdefinierte Clipebenen zugeschnitten, die nur auf der Vertexposition basieren, 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 wird, wenn sich die Vertexposition außerhalb einer Clipebene befindet. Anwendungen können potenzielle Artefakte verhindern, indem Sie eine Rahmengeometrie zu Clip-Ebenen hinzufügen, die so groß wie die maximale Punktgröße sind.

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

Die Hardwarevertexverarbeitung kann die Punktgröße möglicherweise oder nicht unterstützen. Wenn z. B. ein Gerät mit D3DCREATE_HARDWARE_VERTEXPROCESSING auf einem HARDWARE-Abstraktions-Gerät (HAL)-Gerät (D3DDEVTYPE_HAL) erstellt wird, das die MaxPointS9-Struktur der MaxPointS9-Struktur auf 1.0 oder 0,0 festgelegt hat, sind alle Punkte ein einzelnes Pixel. Um Pixelpunkt-Sprites kleiner als 1,0 zu rendern, müssen Sie entweder FVF TL (transformierte und beleuchtete) Scheitelpunkte oder Softwarevertexverarbeitung (D3DCREATE_SOFTWARE_VERTEXPROCESSING) verwenden. In diesem Fall emuliert die Direct3D-Laufzeit das Punkt sprite-Rendering.

Ein Hardwaregerät, das die Vertexverarbeitung durchführt und Punktspit unterstützt – MaxPointSize auf größer als 1,0f festgelegt – ist erforderlich, um die Größenberechnung für nichttransformierte Sprites auszuführen und ist erforderlich, um den Pro-Vertex oder D3DRS_POINTSIZED3DRS_POINTSIZE für TL-Scheitelpunkte ordnungsgemäß festzulegen.

Informationen zum Rendern von Regeln für Punkte, Linien und Dreiecke finden Sie unter Rasterisierungsregeln (Direct3D 9).

Vertexpipeline