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

Aktuelle Zeit: Fr Jul 18, 2025 00:43

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur Render Problem
BeitragVerfasst: Mi Mär 29, 2006 13:33 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

Ich habe da ein Problem mit einer Textur. Und zwar nutze ich auch nur eine einzige. Das ist in meinem Fall eine kleine Landkarte. der Code dazu schaut folgendermassen aus:
Code:
  1.   // Textur rendern
  2.   if FTex <> NIL then begin
  3.     glEnable(GL_TEXTURE_2D);
  4.     glColor3ub(255,255,255);
  5.     FTex.Bind;
  6.     glBegin(GL_QUADS);
  7.       glTexCoord2f(0, 0);  glVertex3f(- 1, +0.0002, - 1);
  8.       glTexCoord2f(0, 1);  glVertex3f(- 1, +0.0002,   1);
  9.       glTexCoord2f(1, 1);  glVertex3f(  1, +0.0002,   1);
  10.       glTexCoord2f(1, 0);  glVertex3f(  1, +0.0002, - 1);
  11.     glEnd;
  12.     glDisable(GL_TEXTURE_2D);
  13.   end;


Und hier wird die Textur geladen (über einen OpenDialog):
Code:
  1.       // Textur laden
  2.       if FTex = NIL then FTex := TglBitmap2D.Create;
  3.       FTex.LoadFromFile (GrafikDatei);
  4.       FTex.GenTexture;


Ich habe eine 2 Texturen da passt alles wunderbar.
Dann gibt es aber einige Texturen, die vollkommen verzerrt sind. Oder die ganze Textur ist in einem merkwürdigen Grau.

Was wirklich verwirrend an der ganzen Sache ist ... Es sind eigentlich fast immer die gleichen Texturen. Sprich ich habe einmal die Karte mit 627*627 Pixeln, einmal mit 600*600, einmal miz 450*450.
600 geht, der Rest nicht. Entweder verzerrt und / oder dieses merkwürdige grau.

Kann mir jemand sagen wo hier jetzt mein Problem liegt? Weil wenn ich dieses Konstrukt nutze:
glTexCoord2f(0, 0); glVertex3f(- 1, +0.0002, - 1);
glTexCoord2f(0, 1); glVertex3f(- 1, +0.0002, 1);
glTexCoord2f(1, 1); glVertex3f( 1, +0.0002, 1);
glTexCoord2f(1, 0); glVertex3f( 1, +0.0002, - 1);
Dann sollten doch gleiche Texturen (die sich nur in der Größe unterscheiden) auch immer gleich verhalten bzw. gleich dargestellt werden, oder sehe ich da was falsch.

Nur das tun sie eben nicht :? :(

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 13:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Texturen sollte man immer im Format 2 hoch n mal 2 hoch n (n sind dabei ganze Zahlen) verwenden. Also zB mit Kantenlänge 32, 64, 128, 256, 512, 1024,... Mit anderen Werten kann es ja nach OpenGL-Version und Grafikkarte gehen, aber das ist eine sehr unsichere Sache. Dass es mit 600x600 geht, wundert mich ehrlich gesagt ein wenig. Probier mal einfach aus, deine Textur auf 512x512 zu skalieren und schau obs geht.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 13:53 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

Ok, nun gehts. Aber nu nhabe ich ein anderes Problem ...

Wenn ich nun eine Karte habe, die eben nicht in dieses Raste passt, dann kann ich die logischerweise beschneiden. Aber gibt es nicht eine Möglichkeit, das man eben auch "unpässige" Formate nutzen kann?

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 14:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm... Eine Möglichkeit wäre, die Texturen in einem Zeichenprogramm auf das Nächstgelegene Format zu strechen, und dann einen Scharfzeichner drüber zu jagen. So hat das Sascha mir seiner Zeit mal erzählt. Er machte das wohl bei seinen Spielen so.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 14:17 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Beste ist natürlich, wenn du von Anfang an darauf achtest, dass die Texturen in diesem Format sind.

Wenn das nicht möglich ist kannst du entweder die Textur so zerschneiden, dass sie ins Raster passt bzw dann irgendwo ein bisschen ungenutzte Textur übrig bleibt. Dann fügst sie mittels mehreren Quads wieder zusammen oder du benutzt Texture_rectangles. Dazu genügt es nach dem Erstellen einer Instanz der Klasse die Eigenschaft Target auf den Wert GL_TEXTURE_RECTANGLE_ARB zu setzen. Solltest du eine ATI Grafikkarte haben dann musst du vorher aber noch etwas in der glBitmap verändern. Bei NVidia sollte es nicht nötig sein.

Und zwar ist in der Methode GenTexture eine Prüfung enthalten ob du so eine Textur überhaupt erstellen darfst. Da ist die Extension GL_EXT_texture_rectangle auskommentiert. Diese hatte bis zu Version 2.0 noch im Header gefehlt. Die ist jetzt aber mit drin. Und zwar ist das in der Zeile 2229 und 3080 der Fall. Auskommentieren und fertig.

Mich wundert es aber, dass du beim Erstellen der Textur keine Exception bekommen hast. Wenn du es so machst wie es da steht hättest du eine Exception bekommen müssen und hättest gar nichts sehen dürfen. Ich prüfe nämlich ab ob die Texture eine Power Of Two ist und wenn nicht dann ob diese überhaupt unterstützt werden.

Ach ja was ich fast (mal wieder) vergessen hätte. Wenn du Texture_rectangles benutzt sind die Texturkoodinaten nicht mehr im Bereich von 0 bis 1 sondern von 0 bis Breite bzw von 0 bis Höhe in Pixel.

PS: Diese Lösung von Flash geht auch aber nur dann wenn es sich eher um Fotos handelt wo man mit qualitativen Verlusten leben kann. Wenn sich die Bilddaten nicht verändern dürfen hast du keine andere Wahl als eine der oberen Methoden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 14:34 
Offline
DGL Member

Registriert: Fr Apr 15, 2005 10:30
Beiträge: 28
Moin !

Zitat:
das Nächstgelegene Format zu strechen, und dann einen Scharfzeichner drüber zu jagen

Ja nö ja ne ... Das is keine gute Idee. Denn ... Wenn ich Landkarten nutze und die stretche, dann verzerrt sich alles und es ist auch nimmer so gut zu erkennen und Wege werden breiter / schmaler, etc ...

Zitat:
benutzt Texture_rectangles

Gibt es dazu vielleicht irgendwo ein einfaches Demo was prinzipiell die Verwendung zeigt?

Zitat:
Diese hatte bis zu Version 2.0 noch im Header gefehlt

Ups ... Ich habe das hier:
{ OpenGL1.5 - Headertranslation (includes GL1.1-1.5) }
{ Version 1.6 }
{ Date : 21.10.2004 ....

Kann ich das problemlos auf die neue Version updaten?

_________________
Greetz Moelski


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 14:35 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
öh doch. Es gibt Alternativen, bei denen zwar das Bild geändert wird, dies fällt aber nicht auf.

Indem man die unpassende Textur auf die nächsthöhere gültige Größe hochskaliert, und dann evtl. einen Schärfefilter drüberjagt, bekommt man durchaus gute Resultate. Je nach Anwendungsfall sollte man mit einem einfachen Resize, also einer Pixelwiederholung (schaut aus wie GL_NEAREST) skalieren und dann ohne Schärfefilter, oder aber mit einem Resmapling (sieht dann so aus wie GL_LINEAR) und dann evtl. mit Schärfefilter. Das bringt erstaunlich gute Ergebnisse und ist auf jeden Fall einen Versuch wert.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 14:45 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
@Lossy: Du bekommst eigentlich nie ne exception wenn deine Graka was nicht kann.Oder meinst du deine Loader wirft die Exception? ...

Meine OnBoard-GL-Implementation kann NonPowerOf2 Texturen darstellen. Ist nur nicht offiziell. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 15:02 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hä? Wenn du die nächst höhere Auflösung nimmst warum muss man dann die Texturdaten noch verändern? Dadurch hat man doch nichts gewonne außer, dass die Textur resampelt werden muss und es so unschärfer und wesentlich langsamer ist. Es spielt ja im Endeffekt auch keine Rolle ob du nun eine 1024x1024 Textur benutzt oder ob dort nur ein 800x600er Teil benutzt wird. Aber durch das Stretchen werden die Texturen grundsätzlich immer verändert und unscharf. Selbst dann wenn man einen Scharfzeichner dann noch anwendet. Aber ich glaube in diesem Falle ist eine pixelgenau Darstellung erwünscht. Weswegen man nicht mit so einer Technik arbeiten kann.

Sonst ist das allerdings schon ein guter Trick. Auch wenn ich diesen nur bei kleiner gerechneten Texturen anwenden würde. In die andere Richtung macht es für mich irgendwie keinen Sinn. ;-)

Texture_rectangle: Also ich könnte dir die Spezifikation anbieten. Aber die ist ersten kompett auf englisch und zweitens würde die dir noch weniger helfen als das was ich geschrieben habe. Eine Demo gibt es davon nicht, da es keinen Sinn machen würde. Ein bisschen Spaß muss für euch ja auch noch bleiben. Sonst wird das Denken noch ganz eingestellt. ;-)

Aber noch mal Langsam.
1. 2.0 Header downloaden und einbinden. Sollte problemlos kompatibel sein.
2. glBitmap editieren und in den entsprechende Zeilen die extension einkommentieren.
3. Nach TglBitmap2D.Create ein FTex.Target := GL_TEXTURE_RECTANGLE_ARB; einfügen.
4. Texturkoordinaten von Range 0..1 auf 0..Breite bze 0..Höhe des Bildes anpassen.
5. Freuen dass es klappt oder in Tränen ausbrechen weil es immer noch nicht geht.

Punkt 5 ist optional alles andere sollte jetzt wohl hoffentlich eindeutig sein.

@Flash: Ja ich meine meinen Loader. Wenn er feststellt, dass ein Texturformat nicht unterstützt wird es aber angefordert wird dann liefert er eine Exception. Außer man fühlt sich unsterblich und deaktiviert die Prüfung bei GenTextures. Dann wird man aber mitunter mit einer weißen Textur bestraft. Wenn es nicht offiziell ist sollte es auch krachen. Wobei der derzeitig aber auch noch nichts mit OpenGL 2.0 anfangen kann. Das fehlt in dem noch.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 29, 2006 16:52 
Offline
Forenkatze
Benutzeravatar

Registriert: Mi Okt 22, 2003 18:30
Beiträge: 1945
Wohnort: Närnberch
Programmiersprache: Scala, Java, C*
mit dem Verändern der Texturdaten meine ich ja das skalieren. Außerdem bleibt das Bild, wenn es hochskaliert wird, wesentlich schärfer, als wenn man es runterskaliert.
Das geht sogar so weit, dass man z.B. bei der GUI kleine nonPowerOfTwoTexturen in die nächstgrößere Textur packen kann, dort so skalieren kann, dass die Textur ganz ausgefüllt wird. Denn wenn man diese zu große Textur dann wieder in der originalen Größe zeichnet, wird sie ja wieder runterskaliert. Das mag im ersten Moment vielleicht graußam klingen, immerhin würde dadurch ja 2 Mal skaliert... einmal hoch und dann wieder runter... aber wenn man das hochskalieren mit Pixelwiederholung macht, fällt das tatsächlich nicht mehr auf. So wird aktuell z.B. die GUI in X-Dream dargestellt und die ist absolut scharf ;) btw wird auch die pixelgenau dargestellt.

_________________
"Für kein Tier wird so viel gearbeitet wie für die Katz'."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mär 30, 2006 08:20 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Zitat:
Außerdem bleibt das Bild, wenn es hochskaliert wird, wesentlich schärfer, als wenn man es runterskaliert.

Das ist ja klar. Mir geht es ja um den Sinn eine Textur größer zu rechnen.

Zitat:
aber wenn man das hochskalieren mit Pixelwiederholung macht

Pixelwiederholung? Das halte ich für sehr gefährlich. Selbst wenn du die Textur ungefiltert darstellst und speziell dann wenn sie gefiltert dargestellt wird. In eurem Falle mag es zwar gehen aber dabei hast du das Problem, dass du zwei unterschiedliche Stellen entscheiden welche Zeile entweder verdoppelt oder weggelassen wird. Wenn die Sachen nicht 100%tig übereinstimmen kann es schnell passieren, dass er eine normale Zeile weglässt obwohl eine andere verdoppelt wurde. Bei GUIs fällt es in der Regel nicht so schnell auf aber je nachdem was du für Bilder hast fällt es sehr gut aus.

Wenn man die Textur aber mit einem Resampler hochrechnet werden die Pixel größer gezogen und wenn man das wieder runterrechnet kann man leichte Störungen entfernen. Das ist ein Trick den ich bei Fotos gerne mache. Aber nie dann wenn es darum geht wirklich pixelgenau zu arbeiten oder wenn man scharfe Kannten hat.

Das was ich bisher aber immer noch nicht begreife ist warum ich meine Textur künstlich hochrechnen sollte obwohl ich sie bereits 1:1 vorliegen habe. Für pixelgenaues Zeichnen dürfte das wohl die optimalste Vorraussetzung sein. Also warum noch groß rumrechnen?

Wie dem auch sei. Ich denke mal jeder hat durchaus seine eigene Methode an so etwas herranzugehen ich habe bisher aber immer wiede gemerkt, dass es wirklich nur genau so aussieht wie es sein soll, wenn man pixelgenau arbeitet. Oder aber man bezweckt etwas anderes, dann kann verwaschen/weichgezeichnet durchaus von Vorteil sein. ;-)


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]