Registriert seit: 18. Nov 2003
Ort: localhost
674 Beiträge
Delphi 2005 Professional
|
Re: Problem mit gestrechten DirectX-Textur-teilen
7. Nov 2005, 22: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*
|