Verwenden von Geometry Blending (Direct3D 9)
Die folgende benutzerdefinierte Struktur kann für Scheitelungen verwendet werden, die zwischen zwei Matrizen kombiniert werden.
// The flexible vertex format (FVF) descriptor for this vertex would be:
// FVF = D3DFVF_XYZB1 | D3DFVF_NORMAL | D3DFVF_TEX1;
struct D3DBLENDVERTEX {
D3DVECTOR v;
FLOAT blend;
D3DVECTOR n;
FLOAT tu, tv;
};
Die Mischungsgewichtung muss nach den Positionsdaten und RHW-Daten in der FVF und vor dem Scheitelpunkt normal angezeigt werden.
Beachten Sie, dass das vorherige Scheitelpunktformat nur einen Überblendungsgewichtungswert enthält. Dies liegt daran, dass es zwei Weltmatrizen geben wird, die in den Transformationszuständen D3DTS _ WORLDMATRIX(0) und D3DTS _ WORLDMATRIX(1) definiert sind. Das System kombiniert jeden Scheitelpunkt unter Verwendung des einzelnen Gewichtungswerts zwischen diesen beiden Matrizen. Für drei Matrizen sind nur zwei Gewichtungen erforderlich, und so weiter.
Hinweis
Das Definieren von Skingewichtungen ist einfach. Die Verwendung einer linearen Funktion des Abstands zwischen den Fugen ist ein guter Anfang, aber eine reibungslosere Sigmoidfunktion sieht besser aus. Die Auswahl einer Verteilungsfunktion für das Skingewicht kann bei Wunsch zu starken Abständen an den Fugen führen, indem eine große Variation des Skingewichts über einen kurzen Abstand verwendet wird.
Festlegen von Blendingmatrizen
Sie legen die Transformationsmatrizen fest, zwischen denen das System kombiniert, indem Sie die IDirect3DDevice9::SetTransform-Methode aufrufen. Legen Sie den ersten Parameter auf einen Wert fest, der durch das D3DTS _ WORLDMATRIX-Makro definiert wird, und legen Sie den zweiten Parameter auf die Adresse der festzulegenden Matrix fest.
Das folgende C++-Codebeispiel legt zwei Weltmatrizen fest, zwischen denen geometrie gemischt wird, um die Täuschung eines gemeinsamen Arms zu erstellen.
// For this example, the d3dDevice variable is assumed to be a valid pointer
// to an IDirect3DDevice9 interface for an initialized 3D scene.
float BendAngle = 3.1415926f / 4.0f; // 45 degrees
D3DMATRIX matUpperArm, matLowerArm;
// The upper arm is immobile. Use the identity matrix.
D3DXMatrixIdentity( matUpperArm );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(0), &matUpperArm );
// The lower arm rotates about the x-axis, attached to the upper arm.
D3DXMatrixRotationX( matLowerArm, -BendAngle );
d3dDevice->SetTransform( D3DTS_WORLDMATRIX(1), &matLowerArm );
Das Festlegen einer Mischungsmatrix bewirkt lediglich, dass das System die Matrix zur späteren Verwendung zwischenspeichert. sie weist das System nicht an, mit dem Mischen von Scheiteltices zu beginnen.
Aktivieren von Geometry Blending
Geometrieblending ist standardmäßig deaktiviert. Rufen Sie zum Aktivieren des Geometrieblendings die IDirect3DDevice9::SetRenderState-Methode auf, um den D3DRS VERTEXBLEND-Renderzustand auf einen Wert aus dem _ aufzählten D3DVERTEXBLENDFLAGS-Typ zu setzen. Das folgende Codebeispiel zeigt, wie dieser Aufruf beim Festlegen des Renderzustands für eine Mischung aus zwei Weltmatrizen aussehen kann.
d3dDevice->SetRenderState( D3DRS_VERTEXBLEND, D3DVBF_1WEIGHTS );
Wenn D3DRS VERTEXBLEND auf einen anderen Wert als D3DVBF DISABLE festgelegt ist, geht das System davon aus, dass die entsprechende Anzahl von Mischungsgewichtungen im Scheitelpunktformat enthalten _ _ ist. Es liegt in Ihrer Verantwortung, ein kompatibles Scheitelpunktformat und eine ordnungsgemäße Beschreibung dieses Formats für die Direct3D-Renderingmethoden zur Verfügung zu stellen.
Wenn diese Option aktiviert ist, führt das System eine Geometriemischung für alle Objekte aus, die von den DrawPrimitive-Renderingmethoden gerendert werden.
Weitere Informationen
FVF-Codes für feste Funktionen (Direct3D 9)