![]() |
Problem mit gestrechten DirectX-Textur-teilen
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo liebe DP'ler,
ich bin bei meinen anfänglichen Schritten in der DirectX (9)-Programmierung auf ein kleines Problem gestoßen, zu dem ich einfach keine Lösung finde. Vielleicht könnt ihr mir ja dabei helfen: Ich lade eine Textur per D3DXCreateTextureFromFile in den Speicher. Diese Textur ist eine Textur-Map, also eine Textur die in viele kleine (gleichgroße) Bereiche unterteilt ist und jeder dieser Bereiche eine extra Textur ist. Eine Test-Textur findet ihr dazu im Anhang (die is ein wenig extrem, aber sie verdeutlicht sehr schön mein problem ^^). Dann erstelle ich einen VertexBuffer, und trage in diesen ein paar Vertices ein, mit samt den Texturkoordinaten für ein Feld aus der Texturmap (in diesem Falle das "Labyrinth"). Nun, und zu guter letzt zeichne ich das ganze dann via DrawPrimitive. Soweit so gut, allerdings hat die Sache einen Haken: Wenn ich den Vertex mehr als 3 mal so groß mache, wie die Größe des Bereichs aus der Texturmap, dann bekomme ich eine ein-Pixel-breite Linie am linken und oberen Rand des Vertex's vom vorhergehenden Bereich aus der Texturmap. Um das ganze zu verdeutlichen hänge ich euch mal einen kleinen Auschnitt davon an. Kennt jemand eine Möglichkeit diesen "Streifen" weg zu bekommen? Danke für jegliche Hilfe, ciao, Philipp |
Re: Problem mit gestrechten DirectX-Textur-teilen
Passe die Texturkoordinaten halt so an, dass der Streifen weg ist. Du musst doch nur die Textur ein ganz kleines Stückchen weiter nach oben und links verschieben. Wo ist das Problem?
|
Re: Problem mit gestrechten DirectX-Textur-teilen
Zitat:
-> das ist keine Lösung (die Idee hatte ich vorher auch schon ^^) ciao, Philipp |
Re: Problem mit gestrechten DirectX-Textur-teilen
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 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. |
Re: Problem mit gestrechten DirectX-Textur-teilen
Zitat:
Zitat:
Hier die wichtigsten Auschnitte aus dem Code:
Delphi-Quellcode:
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.
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 Wären diese nur 2x so groß, würde dieses Problem nicht auftreten. ciao, Philipp |
Re: Problem mit gestrechten DirectX-Textur-teilen
Zitat:
|
Re: Problem mit gestrechten DirectX-Textur-teilen
Zitat:
Zitat:
Dafür isses natürlich so, dass wenn man die Textur dann auf eine größere Fläche strechen lässt, stimmt die Breite der Pixel am linken äußeren Rand nicht mehr mit der größe sonstiger Pixel überein (war auch irgendwie vorhersehbar). Da es aber nicht mein Ziel ist, den richtigen Bruch zu finden (der vermutlich eine Zahl mit unendlich viele Nachkommastellen angeben müsste), ist dies höchstens als temporäre Lösung akzeptabel, denn wenn DX schon derartige Texturkoordinaten unterstützt, muss es meiner Meinung nach auch einen "sauberen" Weg geben, dies zu lösen. Und ich denke nicht, dass ich der einzige bin, der dieses Problem hat, und dies die beste Lösung dafür ist. Zitat:
ciao, Philipp |
Re: Problem mit gestrechten DirectX-Textur-teilen
Du wirst wohl irgendwo mit SetSampletState den Textursampler konfiguriert haben. Schau da mal, ob es irgendwas bringt, wenn du D3DSAMP_MINFILTER und D3DSAMP_MAGFILTER von standardmäßig D3DTEXF_POINT auf D3DTEXF_LINEAR änderst (oder D3DTEXF_NONE, wenn du keinen Texturfilter willst).
|
Re: Problem mit gestrechten DirectX-Textur-teilen
Zitat:
Gibt es noch irgendwelche anderen Möglichkeiten? ciao & thx, Philipp |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz