AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit gestrechten DirectX-Textur-teilen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit gestrechten DirectX-Textur-teilen

Ein Thema von c113plpbr · begonnen am 7. Nov 2005 · letzter Beitrag vom 9. Nov 2005
Antwort Antwort
Benutzerbild von c113plpbr
c113plpbr

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

Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 22:07
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
Miniaturansicht angehängter Grafiken
black_and_white_309.jpg   ingame_textur_147.jpg  
Philipp
There is never enough time to do all the nothing you want.
*HABENWILL*
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#2

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 22:12
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?
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

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

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 22:16
Zitat von Oxmyx:
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?
Schau dir mal die Original-Textur genau an, und die, die ich von DirectX gezeichnet kriege. Vielleicht fällt dir auf, dass ein Pixel von der Original-Textur in der gestrechten Version 3 Pixeln entspricht. Der Streifen ist allerdings genau 1 Pixel breit, d.h. wenn ich die Koordinaten ändere, dann schneide ich mir 3 Pixel ab, und bekomme stattdessen 1 Pixel wieder ...
-> das ist keine Lösung (die Idee hatte ich vorher auch schon ^^)

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

Registriert seit: 21. Sep 2004
499 Beiträge
 
#4

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 22:30
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.
  Mit Zitat antworten Zitat
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, 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*
  Mit Zitat antworten Zitat
Oxmyx

Registriert seit: 21. Sep 2004
499 Beiträge
 
#6

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 7. Nov 2005, 23:18
Zitat von c113plpbr:
Ich bezweifle, dass ich in halben pixeln rechnen kann ...
Texturkoordinaten haben wie gesagt nichts mit Pixeln zu tun. Die bewegen sich im Bereich von 0 bis 1 (bzw. darüber hinaus, wenn gekachelt werden soll). Es kann sein, dass bei der Rasterisierung deine weiße Linie mit reinrutscht (hängt vielleicht auch vom Sampler ab). Verschiebe die Texturkoordinaten mal ein ganz klein wenig nach außen (probier's mal mit 1/512).
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

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

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 8. Nov 2005, 18:25
Zitat von Oxmyx:
Zitat von c113plpbr:
Ich bezweifle, dass ich in halben pixeln rechnen kann ...
Texturkoordinaten haben wie gesagt nichts mit Pixeln zu tun.
Ok, stimmt ... ich hab darüber bisher wenig nachgedacht ...
Zitat von Oxmyx:
Die bewegen sich im Bereich von 0 bis 1 (bzw. darüber hinaus, wenn gekachelt werden soll). Es kann sein, dass bei der Rasterisierung deine weiße Linie mit reinrutscht (hängt vielleicht auch vom Sampler ab). Verschiebe die Texturkoordinaten mal ein ganz klein wenig nach außen (probier's mal mit 1/512).
Bei 1/512 schneidet er mir zuviel ab, und wenn ich sie um 1/1024 verschiebe, hab ich die linie nicht mit drinnen (war ja klar ^^).
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 von Oxmyx:
(hängt vielleicht auch vom Sampler ab)
Ist diese kleine Anmerkung die gesuchte Lösung?!? Ich kenn mich da bisher nicht so gut aus, was müsste ich denn deiner Meinung nach da einstellen?

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

Registriert seit: 21. Sep 2004
499 Beiträge
 
#8

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 9. Nov 2005, 16:55
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).
  Mit Zitat antworten Zitat
Benutzerbild von c113plpbr
c113plpbr

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

Re: Problem mit gestrechten DirectX-Textur-teilen

  Alt 9. Nov 2005, 21:00
Zitat von Oxmyx:
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).
Hab beides ausprobiert, aber es scheint nichts an der linie zu ändern ... nur, dass sie bei D3DTEXF_LINEAR sehr unscharf/verschwommen ist.

Gibt es noch irgendwelche anderen Möglichkeiten?

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz