Also zunächst: Ich bin blutiger Anfänger was OpenGL angeht und möchte mir ein Textur-Viewer der mehrere Texturen gleichzeitig darstellt zur Arbeitserleichterung basteln. Das klappt alles ganz gut ABER leider nur mit quadratischen Texturen. Alle Texturen sind POT. Aber sobald die maße beispielsweise 512x256 sind sieht das gerenderte Ergebnis furchtbar aus. Im Ahnhang findet Ihr ein Vergleich Original/MeinProgramm.
Hier mal der Codeschnipsel den ich zum Laden/Rendern benutze:
Code:
. . procedure TForm1.TexturAnzeigen(Sender: TObject); var Pfad : string; i : byte; Texture : TGLuint; begin for i:= 1 to 8 do begin DeactivateRenderingContext; DestroyRenderingContext (RC[i]); ReleaseDC(TexturPanel[i].Handle, DC[i]);
If FileExists(Ordnerpfad[i]+OrdnerInhalt[n]) = true then begin glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); LoadTexture(Ordnerpfad[i]+OrdnerInhalt[n], Texture, False); glEnable(GL_TEXTURE_2D); glBindTexture(GL_Texture_2D, Texture); glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_WIDTH,@W); glGetTexLevelParameteriv(GL_TEXTURE_2D,0,GL_TEXTURE_HEIGHT,@H); glViewport(0,0,256,256); glBegin(GL_QUADS); glTexCoord2i(0,0); glVertex2i(-1,1); glTexCoord2i(0,1); glVertex2i(-1,-1); glTexCoord2i(1,1); glVertex2i(1,-1); glTexCoord2i(1,0); glVertex2i(1,1); glEnd; SwapBuffers(DC[i]); end . .
Ich hab mal unwichtige sachen rausgelassen und Ihn auf das wesentliche reduziert. Durch Googeln bzw. Foren abklappern war leider nichts herauszufinden. Hab schon alles Mögliche probiert,bin aber mittlerweile ziemlich gefrustet. Und vergebt mir den schlechten Code ich mach das ganze erst seit 3 Tagen . Danke für die Hilfe.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Welche OpenGL-Version verwendest du? Wenn die OpenGL-Version nicht mindestens 2.0 ist musst du schauen ob die Extension GL_ARB_texture_non_power_of_two verfügbar ist. Wenn du weder OpenGL 2.0+ noch die Extension hast dann kann deine Grafikarte bzw. der Treiber keine NPOT-Texturen. Da hilft dann nur die Texturen entsprechend zu vergrößern oder zu verkleinern.
Also ich hab mal geschaut. Bei mir ist OpenGL 2.1 installiert.
Danke erstmal für die schnelle Antwort. Nur eine Frage: Alle Texturen sind bei mir POT nur halt nicht quadratisch. Also das Problem tritt wirklich nur auf wenn Höhe <> Breite ist. Kann das trotzdem damit zusammenhängen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ich sags ja nur ungern aber ich denke nicht, dass das etwas mit NPOT zu tun hat. Denn sonst würdest du eigentlich eine weiße Fläche sehen. Das ist aber nicht der Fall. Sondern die Daten sind einfach nur schrott. Außerdem sind 512x256 vollkommen gültige Texturgrößen. Selbst mit OpenGL 1.2 ist das okay.
Ich vermute mal sehr stark, dass die Texturen eventuell MipMaps besitzen und eventuell auch eine spezielle Komprimierung? DDS ist eine Art Container für Formate. Dabei ist es problemlos möglich irgendwelche Sonderformate einzuhängen. Die glBitmap kann nur DXT1, 3, 5 und unkomprimierte RGB(A) in verschiedenen Kanaltiefen und zusammensetzungen. Es kann hier natürlich sein, dass für die Texturen jetzt eine Kompression verwendet wurde die für die glBitmap lesbar aussieht oder einfach ein entsprechendes Flag nicht ausgewertet wurde. Dann versucht die glBitmap das Format entsprechend dem Angenommenen einzulesen. Und dabei kann unter anderem dann auch so etwas passieren. Eigentlich sollte in solch einem Fall immer ein Fehler ausgelöst werden.
Da kann ich dich nur bitten, dass du mal das originale DDS anhängst. Dann kann ich mir das mal am lebenden Objekt anschauen. Allerdings kann ich dir schon jetzt sagen, dass es nicht in meinem Interesse liegt jegliches von dds mögliche Format zu unterstützen. Dann wäre so ein Loader eine Aufgabe bis ans Lebensende.
PS: Ich persönlich kann dir auch empfehlen, dass du nicht die Methode LoadTexture benutzt sondern direkt die Klasse TglBitmap2D. Damit hast du nach dem Laden noch solche Informationen wie Größe/Breite etc direkt noch. Auch würde beim Löschen der Instanz die Textur freigegeben werden. Was du sonst immer per Hand berücksichtigen musst.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hey Lossay, ich kenn die Codestruktur vom glBitmap jetzt nicht, aber kannst du es nicht ermöglichen, dass man - wenns wirklich nicht anders geht - einen eigenen Loader schreibt und denn in deine Klasse einhängt? Ist sowas prinzipiell möglich? Ich glaube nicht, dass das hier im Interesse von Hivez ist, aber rein vom Prinzip her.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Nun ja. Möglich wäre das sicherlich. Allerdings frage ich mich ob der Nutzen davon so wirklich groß wäre. Bzw ob es überhaupt jemand nutzen würde. Und das ist ein Punkt den ich sehr stark anzweifeln möchte. Wenn es rein nur darum geht, dass man eigene Bilddaten in die Instanzen der glBitmap bekommt, dann kann man das auch jetzt schon. Du kannst mit Create ein neues leeres Bild erstellen und anschließend mit Scanline auf die Pointer zugreifen. Wenn man dann also das Bild reingeschaufelt hat, kann man die Instanzen wie gewohnt benutzen. Die restliche Verwaltung übernimmt dann wieder die glBitmap.
Gibt es eine Möglichkeit die Datei hier im Forum hochzuladen? Per post kommt die Nachricht, das dds nicht erlaubt sei. Und Danke für den Hinweis mit TglBitmap2D. Werde das gleich mal ausprobieren. Hat LoadTexture sonst noch Nachteile? Hatte es verwendet weil es im Wiki als einfache Variante beschrieben stand.
Der Viewer sagt mir übrigens, dass es sich um das Format DXT3 handelt. Allerdings hört sich deine erklärung plausibel an, das es nur als solches erkannt wird aber dennoch anders auszulesen ist. Naja mal schauen.
(*) NVTT ist sowieso das beste zum DDS/DXT komprimieren, wenn deine Grafikkarte CUDA kann. Da dauert das komprimieren dann nicht mehr Minuten sondern nur noch Sekunden. Leider kann die Windows-Variante kein PNG-Format lesen...daher muss man Quellbilder immer erst in z.B. TGA konvertieren. (JPG als Quelle ist keine gute Idee weil dann JPG-Artefakte und DXT-Artefakte im Bild sind.)
Da schau mal einer guck. Die Zip Datei ist oben. Also, der Viewer ist von der Nvidia Seite und ein zweiter Viewer spuckt genau das Gleiche aus. Aber ich schau mir mal die Tools da an.
@Lossy eX: Keine Angst, ich erwarte nicht, dass du die glBitMap deswegen meinen wünschen anpasst. Wenn's nicht geht, dann gehts halt nicht. Würd mich aber freuen, wenn's irgendwie einen Weg "von hinten durch die Brust" gäbe. Wie Gesagt: Das Programm soll am Ende keinen Preis gewinnen, sondern mir nur Arbeit abnhemen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Such mal als Alternative nach einem DDS-Loader von Mars, der den hier vor längerer Zeit ins Forum gestellt hat. Der ist zwar viel rudimentärer als Lossys glBitmap, aber sollte mit so ziemlich allen DDS-Varianten klarkommen, da er afaik anhand der DDS-Specs geschrieben wurde.
Mein DDS-Loader (den ich nicht rausgeben darf) basiert letztlich auf diesem hier von Andreas Jonsson, wobei ich den quasi komplett umgeschrieben habe um ihn bei mir integrieren zu können. Er kann nur die DXT-Formate...dafür sind es aber auch nur 150 Zeilen.
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.