// Width und Height sind die Originalabmessungen des Bitmaps
glTexCoord2f(0,0); glVertex3f(0,Height,0);
glTexCoord2f(0,1); glVertex3f(0,0,0);
glTexCoord2f(1,1); glVertex3f(Width,0,0);
glTexCoord2f(1,0); glVertex3f(Width,Height,0);
glEnd;
Das klappt soweit sehr toll, nur hab ich das Problem, dass die Textur von OpenGL in 16bit dargestellt wird...
Das eingelesene Bitmap ist im Format pf24bit - auch nach dem Assign...
Meine Farbtiefe von Windows ist 32bit - mein GraKa Treiber unterstützt leider kein 24bit - das konnte ich also nicht testen
Gibts irgendeinen Switch, den ich vielleicht übersehen habe oder hab ich irgendeinen Fehler drin?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also es gibt durchaus noch bessere Möglichkeiten als die Textur zu Stretchen. Wenn OpenGL 2.0 vorhanden ist werden Non Power of Two Texturen direkt auch so unterstützt. Bzw vorher gibt es eine (eigentlich 3) Extension(s) die mehr oder weniger gleich sind.
GL_ARB_texture_rectangle GL_NV_texture_rectangle GL_EXT_texture_rectangle
Ati unterstützt leider nur die EXT Variante aber so lange du kein glSlang benutzt ist das auch egal. Der einzige Unterschied besteht in den Fehlenden MipMaps und dem, dass die Koordinaten nicht mehr von 0 bis 1 gehen sondern von 0 bis breite bzw höhe in pixeln.
Benutzen kannst du diese dann wie folgt. Du musst lediglich die Koordinaten anpassen und für die Textur ein anderes Target angeben. Alles andere geschiet dann intern. (PS: Normaltarget ist GL_TEXTURE_2D)
Code:
//LADEN:
Texture := TglBitmap2D.Create;
Texture.LoadFromFile(FileName);
Texture.Target:= GL_TEXTURE_RECTANGLE_ARB;
Texture.SetFilter(GL_NEAREST, GL_NEAREST);
Texture.GenTexture;
//ZEICHNEN:
Texture.Bind(true);
glBegin(GL_QUADS);
// Width und Height sind die Originalabmessungen des Bitmaps
Die 16Bit Texturen. Bei ATI kann man im Treiber einstellen welche Qualität die Texturen haben sollen. Wenn das zu gering eingestellt ist dann ist er so frei und konvertiert deine Textur um. Sollte bei NV auch gehen. Das war auch mal ein Fehler in einem alten ATI Treiber. Aus diesem Grund habe ich eine Möglichkeit eingebaut ein Grafikkartenseitiges Format zu erzwingen. Na ja. So halb. Kann auch benutzt werden um die Texturen auf der Karte komprimiert ablegen zu lassen. Aber Vorsicht das verlängert das laden. Und zwar nicht unwesentlich.
Benutzen kannst du diese dann wie folgt.
Code:
//LADEN:
Texture := TglBitmap2D.Create;
Texture.LoadFromFile(FileName);
Texture.Format:= tf8BitsPerChanel;// Das steht sonst auf Grafikdefault
Also es gibt durchaus noch bessere Möglichkeiten als die Textur zu Stretchen. Wenn OpenGL 2.0 vorhanden ist werden Non Power of Two Texturen direkt auch so unterstützt. Bzw vorher gibt es eine (eigentlich 3) Extension(s) die mehr oder weniger gleich sind. GL_ARB_texture_rectangle GL_NV_texture_rectangle GL_EXT_texture_rectangle
Jo, hab ich gesehen, aber das ist für eine 2D-Anwendung konzipiert, die auch auf Kisten wie meinem alten Notebook mit ner RAGE 128 M3 laufen sollte Werds mal als Performancetweak-Option ins Auge fassen, aber für meinen speziellen Fall handelt es sich eh um wenige Texturen, die auch mal ein Quentchen laden dürfen.
Zitat:
Texture.Format := tf8BitsPerChanel;
Bei mir hat TglBitmapFormat nur (tfDefault, tf16Bit, tf32Bit, tfCompressed) (hab ich eine alte Version?) - tf32Bit hat aber einwandfrei getan und Gradients sehen jetzt endlich sauber aus - danke
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also die TextureRectangle wird schon seit ewigen Zeiten unterstützt. Ich meine selbst meine mittlerweile knapp 10 Jahre alte TNT 2 konnte das. Und ob es für 2D Konzipiert wurde oder nicht spielt ja in erster linie keine Ausschlaggebende rolle. Textur bleibt doch Textur und ganz genau genommen stimmt "2D" ja eigentlich soweiso nicht. Ist ja auch nur 3D allerdings mit einer anderen Projektion. Aber genug zur Spalterrei.
Aber mir geht es da nicht mal um den Geschwindigkeits gewinn sondern eher darum, dass deine Textur verändert wird. Und das ist immer die schlechteste Alternative. Allerdings wenn die TextureRectangle nicht unterstützt würde dann hättest du mehr oder weniger keine andere Wahl.
glBitmap: Ja scheint dann eine ältere Version zu sein. Aber bei den Formaten hat sich nur der Name der Werte verändert. Weil 32 Bit nicht für jedes Format passt. Da ist 8 BitPerChannel schon passender. Die neuste Version findest du wenn ich mich nicht irre im SDK oder auf jeden Fall auf meiner Seite.
Aber mir geht es da nicht mal um den Geschwindigkeits gewinn sondern eher darum, dass deine Textur verändert wird. Und das ist immer die schlechteste Alternative. Allerdings wenn die TextureRectangle nicht unterstützt würde dann hättest du mehr oder weniger keine andere Wahl.
Jo, afais hab ich leider keine andere Wahl - hab jedoch mal einen Pixel-für-Pixel Vergleich von Quelle und Ausgabe gemacht und keinen Unterschied feststellen können - für meine Zwecke passts einwandfrei Ne neue glBitmap hab ich mir mittlerweile geholt - danke
EDIT:
FUCK! hab gerade gemerkt, dass ich wohl ein Problem hab, weil meine Texturen schon mal 4096^2 Pixel haben können...
Wie kann ich so große Grafiken in OpenGL darstellen? Soll ich die Textur entsprechen GL_MAX_TEXTURE_SIZE in Blöcke zerlegen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mal anders gefragt. Was hast du damit genau vor? Evtl gibt es da ja noch eine andere Möglichkeit. Weil das was du da haben willst (4096^2) sind mal eben locker flockig 16 MB Speicher. Auf dem alten System was du ansprichst wirst du da keine 2 Stück von in den Speicher bekommen. Evtl bietet sich ja auch etwas anderes an.
Aber ja. Sonst bleibt dir nichts anderes übrig die Textur zu verlegen. Ob es immer GL_MAX_TEXTURE_SIZE sein sollte lasse ich mal dahin gestellt. Denn 4096 wird dort meistens als Maximum angegeben. NVidia hat zum beispiel vor einer weile auch mal 16k als Viewportgröße zurückgeleifert. Dafür hätte das Gerät gar nicht genügend Speicher außer der Viewport wäre nur 50-100 Pixel hoch. Da du aber ältere Karten unterstützen möchtest würde ich evtl nur maximal 512 oder 1024 oder falls GL_MAX_TEXTURE_SIZE kleiner sein sollte dann das als größe benutzen. Aber evtl gibt es ja auch noch eine ganz andere Möglichkeit für dein Problem.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ach so. Na ja. Wenn du sonst nichts weiter vor hast dann könntest du das auch außerhalb von OpenGL kleiner rechnen. Wenn du allerdings manipulationen mit dem Bild machen möchtest oder später evtl mal machen möchtest oder ranzoomen oder was weiß ich nicht alles, dann würde es sich wohl anbieten es vollständig nach OpenGL zu laden.
Aber okay. Ich würde in jedem Fall vorsehen, dass du die Bilder aufteilen kannst. Ob du es nun in Delphi umrechnest oder nicht. Weil wenn du die Bilder zum Beispiel an die Bildschirmauflösung anpasst kann es natürlich auch vorkommen, dass diese größer ist als die maximale Texturgröße. Das kann man einfach nicht ausschließen.
PS: Mit der neueren glBitmap kannst du auch mittels ScanLines auf die Texturdaten zugreifen. Wenn du eine Leere Textur erstellt hast sollte es ein Leichtes sein die Daten dann dort so einfach hinein zukopieren.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.