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

Aktuelle Zeit: Fr Jul 18, 2025 21:03

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Texturfehler
BeitragVerfasst: So Mai 20, 2007 16:27 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hi, so ein Problem hatte ich irgendwie schonmal, naja ich habe eine 2D OpenGL Anwendung in der eine Tilebasierende Spielwelt gezeichnet wird. Als Textur verwende ich eine große Texture, aus der dann die entsprechenden Texturkoordinaten ermittelt werden.

diese texture reicht vom pixel 0; 0 bis 63; 63 ist also 64*64 pixel groß

momentan verwende ich folgende filter:
Code:
  1.  
  2.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  3.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  4.  


und meine zeichenprozedur sieht so aus:
Code:
  1.  
  2. procedure TWorld.DrawLayer(Layer: TLayer; width, height: integer; voffset: TVector2f);
  3. var
  4.   x, y,
  5.   w, h,
  6.   tx, ty: integer;
  7.   xlen, ylen,
  8.   u, v: single;
  9. begin
  10.   FTextureManager.BindTexture(FTileset);
  11.   for y := 0 to mapsize - 1 do
  12.     for x := 0 to mapsize - 1 do
  13.     begin
  14.       // Frustrum
  15.       // Links
  16.       if fieldsize * (x + 1) < (- voffset.x) then
  17.         continue;
  18.       // Oben
  19.       if fieldsize * (y + 1) < (- voffset.y) then
  20.         continue;
  21.       // Rechts
  22.       if (fieldsize * x) > (width - voffset.x) then
  23.         continue;
  24.       // Unten
  25.       if (fieldsize * y) > (height - voffset.y) then
  26.         continue;
  27.  
  28.       case Layer of
  29.         LowerLayer: begin
  30.                       tx := FLowerLayer[x, y].x;
  31.                       ty := FLowerLayer[x, y].y;
  32.                     end;
  33.         MidLayer:   begin
  34.                       tx := FMidLayer[x, y].x;
  35.                       ty := FMidLayer[x, y].y;
  36.                     end;
  37.         UpperLayer: begin
  38.                       tx := FUpperLayer[x, y].x;
  39.                       ty := FUpperLayer[x, y].y;
  40.                     end;
  41.       end;
  42.  
  43.       FTextureManager.GetSize(FTileset, w, h);
  44.  
  45.       xlen := texsize / w;
  46.       ylen := texsize / h;
  47.  
  48.       u := xlen * tx;
  49.       v := ylen * ty;
  50.  
  51.       glPushMatrix;
  52.         glTranslatef(fieldsize * x, fieldsize * y, 0);
  53.         glBegin(GL_QUADS);
  54.           glTexCoord2f(u,        v);        glVertex3f(0,         0,         0);
  55.           glTexCoord2f(u,        v + xlen); glVertex3f(0,         fieldsize, 0);
  56.           glTexCoord2f(u + xlen, v + xlen); glVertex3f(fieldsize, fieldsize, 0);
  57.           glTexCoord2f(u + xlen, v);        glVertex3f(fieldsize, 0,         0);
  58.         glEnd;
  59.       glPopMatrix;
  60.  
  61.       inc(MainForm.faces);
  62.     end;
  63. end;
  64.  


das hässliche ist nun, dass zwischen den einzelnen feldern striche sind (255, 0, 255 - die farbe in der die anliegenden texturen sind). also wird scheinbar zuviel von der textur verwendet. ich möchte diese "vermischung" nicht. hier ein screenshot:

Bild

die texture (unkomprimiert [BMP als zip]) gibt es hier:

http://www.exec-dev.de/texture.zip

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mai 20, 2007 18:22 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hier scheint das gleiche problem aufgetreten zu sein, allerdings verwende ich 512er texturen

viewtopic.php?t=3883&highlight=


wenn ich komplett auf GL_NEAREST stelle, ist der effekt minimal, aber dennoch vorhanden


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 14:56 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
auf einem anderen pc tritt dieser fehler nicht auf, grafikkartenabhängig oder einstellungssache ? (AA etc)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 15:29 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also wenn das selbst mit GL_NEAREST / GL_NEAREST auftritt dann kann eigentlich nur etwas mir deinen Koordinaten nicht stimmen. Auch wenn ich da so spontan keinen Fehler erkenne. Wobei ich vermuten würde, dass deine Textur koordinaten 1 Pixel zu groß sind.

Mit meiner Bildschirmlupe kann ich auch vertikal einen ganz leichten Verlauf richtung Rosa erkennen. Nicht viel aber nur ganz leicht.

Als Test kann du auch mal eine angepasste Textur benutzen. Also eine die einen Rand in einer anderen Farbe hat. Blau oder so was. Dann kannst du zu mindest erkennen on der Rand deines Tiles komplett richtig dargestellt wird oder nicht.

Wobei du das aber auch nicht Pixelgenau darstellst. Dadurch müssen die Texturen kleiner gerechnet werden evtl liegt es daran, dass es auf dem einen System geht und auf dem Anderen nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 16:15 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
wenn ich einen rand in einer anderen farbe nehme, wird selbstverständlich dieser dargestellt ;)

ich hab das ganze aber mal auf einem schul-pc getestet und da sieht alles so aus, wie es aussehen soll.
selbst wenn ich mich massiv schnell über die welt bewege sieht alles völlig i.O. aus. Nur will ich, dass
wenn ich ein Spiel entwickle, es bei mir auch so aussieht, wie es soll ;)

Der Fehler tritt auch im moment nur auf, wenn ich mich in der welt bewege, dann "schimmern" die linien

(ähnliche fehler hab ich zT auch manchmal bei programmen, die etwas auf den desktop zeichnen, bzw schreiben (text) [pinker rand])

Bild

grafikkarte: radeon 9600, treiber: recht aktuell

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Na ja. Wenn der Rand dargstellt wird heißt das es wird nichts abgeschnitten. Aber wenn du zu viel zeichnest dann merkst du da ja nichts. Höchstens dadurch, dass neben dem Rand noch eine andere Farbe existiert.

Aber skaliere das einfach mal alles. Wie gesagt sieht es für mich nicht so aus als ob es Pixelgenau gezeichnet wird sondern kleiner. Da du keine MipMaps hast muss die Grafikkarte das kleiner Filtern. Kann sein, dass da der ein oder andere etwas anders macht.

Aber probier mal bei deiner Textur etwas anderes als Pink und schau wie es sich verhält. Die Linie sollte sich dann anders färben.

Schrift auf dem Desktop. Also ich weiß nicht wie das zusammengehören soll.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 21, 2007 18:38 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Ich hoffe ich hab das mit skalieren richtig verstanden, zumindest habe ich das bild mittels glScalef 4fach vergrößert und man erkennt leicht, dass dort ein bissl pink verwendet wird. allerdings ist dieser effekt auf normaler größe nur zu sehen, wenn ich bewegung der fehler drin hab (also mittels translate navigiere)

nehme ich statt clfuchsia eine andere farbe, werden die rillen eben in dieser dargestellt

Bild


wenn ich bei der graka anisotropische filterung und antialiasing einschalte wird der effekt wieder deutlicher

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 23, 2007 13:44 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ist der fehler jetzt rein system abhängig ? wenn gewünscht kann ich hier mal ne exe oder so ranhängen


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 23, 2007 15:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
So wie ich das sehe, hast du einen Fehler in deinen Koordinaten, wie Lossy es schon angesprochen hat, da normalerweise solche Texturprobleme nicht auftreten. Lösungen wären daneben aber auch, anstatt dem penetranten Lila, welches du ja offensichtlich sowieso nicht rausmaskst, ein Schwarz zu nehmen, das fällt zumindest bei der zweiten Variante (letzter Screenshot) nicht auf.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Textur-Problem
BeitragVerfasst: Do Mai 24, 2007 10:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mai 23, 2007 10:56
Beiträge: 6
Wohnort: Braunschweig
Hallo!

Ich bin zwar C++ Programmierer, aber ich hatte dasselbe Problem!

Versuch es mal damit:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

Außerdem ist es besser, bei der Berechnung der Texturkoordinaten Double-Precision
zu nehmen statt Single. Die End-Koordinate sollte auf jeden Fall eine Punktlandung
bei 1.0 machen - bei 0.9995 kann es zu "Cracks" kommen.

Viele Grüße, Martin

Hier sieht man deutlich den Unterschied:

Vorher:
Bild

Nachher:
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 24, 2007 11:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
GL_CLAMP_TO_EDGE geht hier leider nicht. Es handelt sich bei der Textur ja nur um einen Teil der ganzen Textur und das GL_CLAMP_TO_EDGE wirkt nur am Rand der gesammten Textur.

Das mit Single und Double wäre sicher ein Versuch wert. Wobei ich aber eigentlich auch nur mit Singles arbeite und so etwas bisher noch nicht hatte. Aber wenn die Werte ungünstig getroffen wurden. ;)

Im übrigen Martin Herzlich Willkommen im Forum. Was ist das eigentlich für ein gut aussehendes Projekt? Wie haben da so eine kleine Ecke wo man Projekte vorstellen kann. ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 24, 2007 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mai 23, 2007 10:56
Beiträge: 6
Wohnort: Braunschweig
Zitat:
GL_CLAMP_TO_EDGE geht hier leider nicht. Es handelt sich bei der Textur ja nur um einen Teil der ganzen Textur und das GL_CLAMP_TO_EDGE wirkt nur am Rand der gesammten Textur.


Ja, stimmt. Das war ist es also nicht. Diese Problem mit den Cracks taucht immer wieder mal auf. Meist sind die Texturkoordinaten schuld,
es kann aber auch an den Vertex-Daten liegen. OpenGL ist hier ziemlich pingelig, was die Genauigkeit angeht.

Zitat:
Das mit Single und Double wäre sicher ein Versuch wert. Wobei ich aber eigentlich auch nur mit Singles arbeite und so etwas bisher noch nicht hatte. Aber wenn die Werte ungünstig getroffen wurden. Wink


Ich hatte schon mal so einen Fall, wo die Berechnung der Texturkoordinaten mit "double" das Problem gelöst hat.


Zitat:
Im übrigen Martin Herzlich Willkommen im Forum. Was ist das eigentlich für ein gut aussehendes Projekt? Wie haben da so eine kleine Ecke wo man Projekte vorstellen kann. Wink


Das Programm heißt "Diercke Globus". Unsere Firma hat es für den Westermann Schulbuch-Verlag entwickelt.

Viele Grüße, Martin


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 24, 2007 15:01 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Lord Horazont hat geschrieben:
So wie ich das sehe, hast du einen Fehler in deinen Koordinaten, wie Lossy es schon angesprochen hat, da normalerweise solche Texturprobleme nicht auftreten. Lösungen wären daneben aber auch, anstatt dem penetranten Lila, welches du ja offensichtlich sowieso nicht rausmaskst, ein Schwarz zu nehmen, das fällt zumindest bei der zweiten Variante (letzter Screenshot) nicht auf.

Gruß Lord Horazont

das lila wird ja noch weggemaskt, aber dann hab ich da halt löcher, mit dem lila sieht man den fehler besser.
und wenns einen fehler gibt, wo liegt dieser ?

wenn ichs auf double umstelle bringts nichts, aber ich habs ja auf nem anderen rechner schon getestet, und da ging das, wie gesagt, auf manchen rechnern macht er den fehler, auf manchen anderen net.


mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 25, 2007 19:54 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
hm momentan habe ich die streifen nur horizontal, das ist echt skuril Oo und auch nur wenn ich mich auf bestimmte positionen bewege (deshalb sieht man das ja auch in der bewegung)

mfg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturfehler
BeitragVerfasst: Fr Mai 25, 2007 22:44 
Offline
DGL Member

Registriert: Mi Mai 23, 2007 09:12
Beiträge: 4
Seth hat geschrieben:

Code:
  1.  
  2.  
  3.       xlen := texsize / w;
  4.       ylen := texsize / h;
  5.  
  6.       u := xlen * tx;
  7.       v := ylen * ty;
  8.  
  9.       glPushMatrix;
  10.         glTranslatef(fieldsize * x, fieldsize * y, 0);
  11.         glBegin(GL_QUADS);
  12.           glTexCoord2f(u,        v);        glVertex3f(0,         0,         0);
  13.           glTexCoord2f(u,        v + xlen); glVertex3f(0,         fieldsize, 0);
  14.           glTexCoord2f(u + xlen, v + xlen); glVertex3f(fieldsize, fieldsize, 0);
  15.           glTexCoord2f(u + xlen, v);        glVertex3f(fieldsize, 0,         0);
  16.         glEnd;
  17.       glPopMatrix;
  18.  
  19. end;
  20.  




Hi, ich hab mit Texturen noch recht wenig Erfahrung, also bitte fallt nicht alle über mich her, falls ich hier nur Unsinn poste :wink:

Was mir aufgefallen ist bzw. ich mich frage:
a) wieso glTexCoord2f(u + xlen, v + xlen); müsste hier nicht eigentlich glTexCoord2f(u + xlen, v + ylen); stehen?

Wo doch auch v := ylen * ty; ist... wobei das hier natürlich egal sein sollte, weil es sich ja um eine quadratische Textur handelt.

b) vielleicht hilft´s, wenn Du statt xlen := texsize / w; bzw. ylen := texsize / h;
xlen := (texsize-1) / w; und ylen := (texsize-1) / h; verwendest, dann solltest Du bei einer Rundung im Zweifellsfall zu kurz und damit "im Grüne" landen.

Gruß Bran


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 15 Queries | GZIP : On ]