[Direct3D9] Untransformierte Vektoren wie Transformierte Vektoren?



  • Hallo,
    ich habe irgendwann mal ein Artikel in der MSDN gelesen, dass bei Direct3D9 die vortransformierten Vektoren bei -0.5|-0.5 anfangen.
    Jetzt habe ich aber sowas:

    struct TEXTUREVERTEX {
    	float x, y, z, u, v;
    	enum {FVF = D3DFVF_XYZ | D3DFVF_TEX1};
    };
    
    //---------------------------
    
    TEXTUREVERTEX vertices[4] = {
    	0.0f,										  0.0f,											 0, 0, 0,
    	0.0f,										  static_cast<float>(WindowDimension::Height()), 0, 0, 1,
    	static_cast<float>(WindowDimension::Width()), 0.0f,											 0, 1, 0,
    	static_cast<float>(WindowDimension::Width()), static_cast<float>(WindowDimension::Height()), 0, 1, 1,
    };
    
    // ...
    
    d3dd->SetTexture(0, renderTexture);
    d3dd->SetFVF(TEXTUREVERTEX::FVF);
    d3dd->SetStreamSource(0, vBuffer, 0, sizeof(TEXTUREVERTEX));
    d3dd->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    d3dd->SetTexture(0, nullptr);
    

    Dabei wird die Textur aber verschoben angezeigt, ich sehe also den Schnitt zwischen dein Dreiecken. Wenn ich aber bei jedem Vektore 0.5f abziehe passt es wieder. Wieso ist das hier so?



  • Hat da niemand eine Ahnung, oder will mit niemand antworten?



  • Ich vermute mal dass du auf das hier hinauswillst!? Ansonsten wär vielleicht ein Screenshot von deinem Problem interessant...



  • Ja, genau darauf wollte ich hinaus.
    Also wenn ich es so mache:

    TEXTUREVERTEX vertices[4] = {
    	-0.5f,												 -0.5f,													0, 0, 0,
    	-0.5f,												 static_cast<float>(WindowDimension::Height() -0.5f),	0, 0, 1,
    	static_cast<float>(WindowDimension::Width() - 0.5f), -0.5f,													0, 1, 0,
    	static_cast<float>(WindowDimension::Width() - 0.5f), static_cast<float>(WindowDimension::Height() - 0.5f),	0, 1, 1,
    };
    

    sieht es so aus.
    Wenn ich es so mache:

    TEXTUREVERTEX vertices[4] = {
    	0.0f,												 0.0f,													0, 0, 0,
    	0.0f,												 static_cast<float>(WindowDimension::Height()),	0, 0, 1,
    	static_cast<float>(WindowDimension::Width()), 0.0f,													0, 1, 0,
    	static_cast<float>(WindowDimension::Width()), static_cast<float>(WindowDimension::Height()),	0, 1, 1,
    };
    

    sieht es so aus.
    Man sieht also den "Schnitt" zwischen den Dreiecken. Obwohl die Vektoren alle vorher noch durch die Pipeline gehen, muss ich deren Position mit 0.5f subtrahieren, damit ich ein vernünftiges Ergebnis erziele.
    Die Vektoren auf der Texture rende ich direkt auf die Textur, da habe ich aber auch alle Vektoren mit 0.5f subtrahiert.



  • Pikkolini schrieb:

    Obwohl die Vektoren alle vorher noch durch die Pipeline gehen, muss ich deren Position mit 0.5f subtrahieren, damit ich ein vernünftiges Ergebnis erziele.

    Ja klar!? Mich wundert zwar dass sich das gerade in diesem Schnitt äußert aber machen musst dus natürlich.



  • Pretransformed vs. "normal" unterscheidet sich doch nur darin, dass bei "normal" der Vektor noch mit den diversen eingestellten Matritzen multipliziert wird, bei "pretransformed" dagegen nicht.
    Und wenn die Matritzen alle "identity" sind, dann unterscheidet es sich halt gar nicht (ausser dass man bei "normal" den RHW Wert nicht angibt).

    Wenn du den Offset von -0.5 dagegen in z.B. deine Projektionsmatrix mit reinnimmst, dann musst du den bei den Koordinaten natürlich nicht mehr dazurechnen.

    p.s.: wieso verwendest du nicht gleich pretransformed Vertices?


Anmelden zum Antworten