Einzelnen Beitrag anzeigen

Benutzerbild von c113plpbr
c113plpbr

Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 21:58
Zitat von Oxmyx:
Texturkoordinaten werden doch nicht in Pixel angegeben. Das heißt, du musst einfach einen gewissen Wert (irgendwas mit 0 komma irgendwas) abziehen, bis der Streifen verschwunden ist.
Ich bezweifle, dass ich in halben pixeln rechnen kann ...
Zitat von Oxmyx:
Ich verstehe auch nicht, was du mit "Wenn ich den Vertex mehr als 3 mal so groß mache, wie die Größe des Bereichs aus der Texturmap" meinst. Erstens hat ein Vertex keine Größe und zweitens haben die 3D-Koordinaten rein garnichts mit den Pixeln der Textur zu tun, sowas wie "3 mal so groß" kann es also gar nicht geben. Zeig doch mal ein Stückchen von deinem Code.
Naja, wenn der Vertex direkt "auf den Bildschirm" gezeichnet wird, (also mit RHW Parameter,) dann sind Texturgröße und "Vertices-größe" (also, quasi den platz den alle miteinander einnehmen, is nen bissl dumm auszudrücken; edit#3: jetzt hab ich das richtige wort gefunden: Polygongröße ) direkt vergleichbar.

Hier die wichtigsten Auschnitte aus dem Code:
Delphi-Quellcode:
type
  PVertex = ^TVertex;
  TVertex = record
    x, y, z, rhw : single; // Position des Vertex
    c : DWORD; // Farbe des Vertex
    tu, tv : single; // Texturkoordinaten des Vertex
  end;

const
  FVF = D3DFVF_XYZRHW or D3DFVF_TEX1 or D3DFVF_DIFFUSE;

procedure AddTriangleToVB(x1, y1 : Real; tu1, tv1 : single; c1 : DWORD;
                          x2, y2 : Real; tu2, tv2 : single; c2 : DWORD;
                          x3, y3 : Real; tu3, tv3 : single; c3 : DWORD);
begin
  AddVertexToVB(x1, y1, tu1, tv1, c1);
  AddVertexToVB(x2, y2, tu2, tv2, c2);
  AddVertexToVB(x3, y3, tu3, tv3, c3);

  Inc(fVBTriangles);
end;

procedure AddVertexToVB(x, y : Real; tu, tv : single; c : DWORD);
var
  pVertices : Pointer;
  Vertex : TVertex;
begin
  Vertex.x := x;
  Vertex.y := y;
  Vertex.z := 1;
  Vertex.rhw := 1;
  Vertex.tu := tu;
  Vertex.tv := tv;
  Vertex.c := c;

  fVB.Lock(fVBOffset * SizeOf(TVertex), SizeOf(TVertex), pVertices, D3DLOCK_DISCARD);
    Move(Vertex, pVertices^, SizeOf(TVertex));
  fVB.Unlock;
  Inc(fVBOffset);
end;

procedure Render;
begin
  Device.SetRenderState(D3DRS_ALPHABLENDENABLE, 1);
  Device.SetRenderState(D3DRS_ZENABLE, 0);

  Device.SetFVF(FVF);
  Device.SetStreamSource(0, fVB, 0, sizeof(TVertex));
  Device.SetTexture(0, fAtlas);

  Device.DrawPrimitive(D3DPT_TRIANGLELIST, 0, fVBTriangles);
end;

//Hinzufügen von 2 Dreiecken zum VertexBuffer:
  AddTriangleToVB(32, 32, 64/256, 32/256, $00FFFFFF, //Links oben
                  128, 128, 96/256, 64/256, $00FFFFFF, //Rechts unten
                  32, 128, 64/256, 64/256, $00FFFFFF); //Links unten

  AddTriangleToVB(32, 32, 64/256, 32/256, $00FFFFFF, //Links oben
                  128, 32, 96/256, 32/256, $00FFFFFF, //Rechts oben
                  128, 128, 96/256, 64/256, $00FFFFFF); //Rechts unten
Aus den angegebenen Dreiecksgrößen lässt sich herauslesen, dass die Textur auf 2 Dreiecke gestrecht wird, die insgesamt, von den Maßen genau 3x so groß sind wie die Fläche der Textur.
Wären diese nur 2x so groß, würde dieses Problem nicht auftreten.

ciao, Philipp
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat