Point Sprites (Direct3D 9)
Die Unterstützung für Punkt-Sprites in Direct3D 9 ermöglicht das hochleistungsfähige Rendering von Punkten (Partikelsysteme). Punktspites 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 zum Steuern des Renderns von Punkt-Sprites (Punktgrundtypen). Mit diesen Parametern können Punkte variabler Größe sein und eine vollständige Texturzuordnung angewendet werden. Die Größe jedes Punkts wird durch eine anwendungsspezifische Größe bestimmt, die mit einer entfernungsbasierten Funktion kombiniert wird, 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 Eine Scheitelpunktgröße gilt. Die Punktgröße wird in Kameraraumeinheiten ausgedrückt, mit Ausnahme, wenn die Anwendung posttransformationierte flexible Vertex-Vertizes (FVF)-Scheitelpunkte übergibt. In diesem Fall wird die entfernungsbasierte Funktion nicht angewendet, und die Punktgröße wird in Einheiten von Pixeln im Renderziel ausgedrückt.
Die beim Rendern von Punkten berechneten und verwendeten Texturkoordinaten hängen von der Einstellung D3DRS_POINTSPRITEENABLE ab. Wenn dieser Wert auf TRUEfestgelegt 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ößenberechnungen
Die Punktgröße wird durch D3DRS_POINTSCALEENABLE bestimmt. Wenn dieser Wert auf FALSE-festgelegt ist, wird die anwendungsspezifische Punktgröße als Bildschirmbereichsgröße (nach der Transformation) 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 TRUEist, berechnet Direct3D die Größe des Bildschirmraumpunkts gemäß 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 Größe des Eingabepunkts S ientweder 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ₑ) und die folgende Operation ausgeführt wird.
D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)
Die maximale Punktgröße Pmₐₓ wird bestimmt, indem der kleinere teil des MaxPointSize-Elements der D3DCAPS9 Struktur oder des D3DRS_POINTSIZE_MAX Renderzustands verwendet wird. Die Mindestpunktgröße Pminwird durch Abfragen des Werts von D3DRS_POINTSIZE_MIN bestimmt. Daher wird die endgültige Bildschirmraumpunktgröße S wie folgt 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 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 bei jedem Scheitelpunkt dupliziert. somit wird jeder Punkt immer mit Konstantenfarben gerendert.
Die Zuweisung von Texturindizes wird durch die Einstellung des D3DRS_POINTSPRITEENABLE Renderzustands gesteuert. Wenn D3DRS_POINTSPRITEENABLE auf FALSEfestgelegt ist, werden die Vertextextkoordinaten bei jedem Scheitelpunkt dupliziert. Wenn D3DRS_POINTSPRITEENABLE auf TRUEfestgelegt 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 gezeigt.
Wenn der Clipping aktiviert ist, werden Punkte wie folgt abgeschnitten. Wenn der Scheitelpunkt den Bereich der Tiefenwerte überschreitet – MinZ und MaxZ der D3DVIEWPORT9 -Struktur, in die eine Szene gerendert werden soll, ist der Punkt außerhalb des Ansichtsfrstums vorhanden und wird nicht gerendert. Wenn sich der Punkt unter Berücksichtigung der Punktgröße vollständig außerhalb des Viewports in X und Y befindet, 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 dennoch teilweise sichtbar ist.
Punkte können 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 Clipebenen 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 unterstützt möglicherweise die Punktgröße. Wenn z. B. ein Gerät mit D3DCREATE_HARDWARE_VERTEXPROCESSING auf einem HAL-Gerät (Hardware abstraction layer, D3DDEVTYPE_HAL) erstellt wird, das das MaxPointSize-Element der D3DCAPS9 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 Point Sprite-Rendering.
Ein Hardwaregerät, das die Vertexverarbeitung durchführt und Punktspites unterstützt – MaxPointSize auf größer als 1,0f festgelegt – ist erforderlich, um die Größenberechnung für nichttransformierte Sprites durchzuführen und muss den pro Scheitelpunkt oder D3DRS_POINTSIZED3DRS_POINTSIZE für TL-Scheitelpunkte ordnungsgemäß festlegen.
Informationen zum Rendern von Regeln für Punkte, Linien und Dreiecke finden Sie unter Rasterungsregeln (Direct3D 9).
Verwandte Themen