Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 12, 2025 10:53

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glTexCoord2f ist ungenau..?
BeitragVerfasst: So Mai 28, 2006 20:42 
Offline
DGL Member

Registriert: So Jul 17, 2005 12:59
Beiträge: 89
Hi,

ich habe für mein Spiel eine Textur erstellt, die viele kleine Einzelbilder erstellt. Diese sollen nun teilweise gleichzeitig auf Quads augegeben werden.

Dazu habe ich mir folgende Funktion geschrieben:

Code:
  1.  
  2.  
  3. type TexPos2f=packed record
  4.   X, Y: Real;
  5. end;
  6.  
  7. type TexPos4f=packed record
  8.   Top, Bottom: TexPos2f;
  9. end;
  10.  
  11. implementation
  12.  
  13. function cGameUtils.calculateTexFramePosition(pFrame, pSingleWidth, pSingleHeight, pTexWidth, pTexHeight: integer): TexPos4f;
  14. var
  15.   tmpX: integer;
  16.   tmpY: integer;
  17. begin
  18.  
  19.   tmpX := 0;
  20.   tmpX := pFrame * pSingleWidth;
  21.  
  22.   tmpY := 0;
  23.  
  24.   if tmpX + pSingleWidth > pTexWidth then
  25.   begin
  26.     tmpY := (trunc((tmpX + pSingleWidth)/pTexWidth));
  27.     pFrame := pFrame - (tmpY* trunc(pTexWidth/pSingleWidth));
  28.     tmpY := tmpY * pSingleHeight;
  29.   end;
  30.  
  31.   result.Top.Y := tmpY/pTexHeight;
  32.   result.Top.Y := 1-result.Top.Y;
  33.   result.Bottom.Y := (tmpY+pSingleHeight)/pTexHeight;
  34.   result.Bottom.Y := 1-result.Bottom.Y;
  35.  
  36.   result.Top.X := (pSingleWidth*pFrame/pTexWidth);
  37.   result.Bottom.X := (((pSingleWidth*pFrame)+pSingleWidth)/pTexWidth);
  38. end;
  39.  
  40.  


Diese Funktion berechnet mir die Koordinaten für die Textur, je nach Größe der Bilder etc. Funktioniert auch soweit sehr gut.

Leider ist die Anzeige der Textur manchmal "ungenau". Am Rand des Quads ist dann ein 1-Pixel breiter Streifen zu sehen.

Nachdem ich mich hier mal dazu umgeschaut habe, habe ich dann den Texturmodus mal auf GL_NEAREST gestellt. Mit dieser Einstellung ist obiges Probolem tatsächlich nicht vorhanden. Aber leider sieht das eben bei weitem nicht so schön aus wie mit GL_LINEAR.

Ein weiterer Versuch, die Koordinaten als Currency statt real auszugeben verlief auch negativ.

Woran liegt das und wie kann ich das verhindern?

Edit: Achso, und so zeichne ich dann mein Quad:

Code:
  1.  
  2. glBegin(GL_QUADS);
  3.  glColor4f(1,1,1,0.85);
  4.  glTexCoord2f(texPositions.Top.X,texPositions.Top.Y);       glVertex2f(0, 0);
  5.  glTexCoord2f(texPositions.Bottom.X,texPositions.Top.Y);       glVertex2f(35, 0);
  6.  glTexCoord2f(texPositions.Bottom.X,texPositions.Bottom.Y);       glVertex2f(35, -35);
  7.  glTexCoord2f(texPositions.Top.X,texPositions.Bottom.Y);       glVertex2f(0, -35);
  8. glEnd;
  9.  


Danke + Grüße
Passi[/pascal]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 28, 2006 20:59 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Das mit dem Linear und Nearest sind ja verschiedene Filter.
Da die aber nicht wissen, das es Teilbereiche sind, und wendet es daher aufs ganze Bild an.
Dadurch tritt der Effekt auf.
Als Schutzmassnahme solltest du einen 1-2 Pixel grossen Bereich um die Teilbereiche kopieren oder ähnlich.
Damit könntest du den Effekt verhindern.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 28, 2006 21:28 
Offline
DGL Member

Registriert: So Sep 26, 2004 05:57
Beiträge: 190
Wohnort: Linz
Hier wird beschrieben warum das Problem auftritt. Das mit den 1-2 Pixel Rand ist eine gute Lösung, muss aber nicht unbedingt sein. Ganz unten bei dem Link hast du folgende Formel:
0.5/Breite + Texel/Breite
für den Punkt für den ein Texel bei linearer Filterung angegeben wird.

Bsp:
Texturbreite = 64 Pixel
Texturhöhe = 128 Pixel
Du willst X-Coordinate von Pixel 0-15 und Y-Coordinate von 16-31
=> Texturcoordinaten
X-Links = 0.5 / 64 + 0
X-Rechts = 0.5 / 64 + 15 / 64
Y-Oben (oder unten je nach Sichtweise) = 0.5 / 128 + 16 / 128
Y-Unten = 0.5 / 128 + 31 / 128
Dann sollte es keine unerwünschten Ränder geben.

Problematisch kann es allerdings werden wenn du Mipmapping verwendest, da dann gluBuild2DMipmaps jeweils 4 Pixel interpoliert, wodurch du wiederum Ränder bekommen kannst. Ähnlich kann es dir ergehen wenn du keine Seitenlängen von 2^x hast und gluBuild2DMipmaps verwendest. In beiden Fällen hilft wiederum ein Rand für jede Grafik ... bis zu einem gewissen Grad zumindest.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 14 Queries | GZIP : On ]