Ich wollte folgenden Code in der VirtualBox testen, nur ist es dort mit einem SIGSEV abgeschmiert. Ursache: in der VB wird nur OpenGL 1.1 unterstütz und glGenerateMipmap(... wird erst ab OpenGL 3.0 unterstützt.
Code:
pic := TPicture.Create;
pic.LoadFromFile('project1.ico');// Es gehen auch jpg/bmp/ico
glGenerateMipmap(GL_TEXTURE_2D);// Hier schmiert es ab.
end;
Wie hatte man dies mit OpenGL 1.1 gelöst ?
Das einzige was ich finden konnte, war ein alter Delphi-Code von mir. Dort wurde die Textur in DrawScene geladen. Kann dies sein, das man früher die Texturen bei jedem Frame neu laden musste ? Ich finde im Delphi-Code auch nirgends ein glGenTextures(... oder glBindTexture(... .
Code:
procedure TfrmCube.DrawScene;
begin
glNewList(11, GL_COMPILE);
glBegin( GL_QUADS );
glTexCoord2f(0.0,0.0); glVertex2f(-1,1);
glTexCoord2f(1.0,0.0); glVertex2f(1,1);
glTexCoord2f(1.0,1.0); glVertex2f(1,-1);
glTexCoord2f(0.0,1.0); glVertex2f(-1,-1);
glEnd;
glEndList;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Ich habe es jetzt so probiert, unter Wine und Linux geht es. In der VB stützt das Programm nicht mehr ab, aber das Bild bleibt weiss, nicht mal der Hintergrund welcher mit glClearColor festgelegt wurde wird gezeichnet.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Glu benutzt nicht die GL Konstanten sondern hat Teilweise eigene Glu Geschichten. Die Mipmap Funktion ist so ein Fall und du solltest eigentlich einen entsprechenden Fehler bekommen weil du nicht GLU_RGBA benutzt hast. Du kannst aber auch 1,2,3 und 4 statt der Konstanten benutzen. Machts vielleicht etwas einfacher weil es fuer OpenGL und Glu funktioniert.
Jedenfalls bei den guten alten Implementierungen... Bei neuen kannst du den Fuchs fragen und dich freuen wenn der Rechner nicht in Flammen aufgeht
Am besten die Daten von Hand skalieren und den 2. Parameter von "glTexImage2D" benutzen. Das sollte auf jeden Fall funktionieren.
Ich weis nicht, was du skalieren willst, die Textur hat schön 128x128 Pixel.
Aber ein bisschen bin ich weiter gekommen. Mit folgenden Code bekomme ich unter Linux und Wine die Texturen, trotz fehlendem glGenerateMipmap. Lasse ich aber die glTexParameterf Zeilen weg, wird die Textur weiss. Ich hätte nicht gedacht, das glTexParameterf eine Einfluss hat, das nichts kommt.
Aber in der VB bleibt das Fenster immer noch komplett weiss.
Siehe meinen letzten Edit. BGRA ist vermutlich nicht supported.
Wen ich dies auf RGBA änder, kommt das Bild unter Linux/Wine wie erwartet in Falschfarben. In der VB kommt immer noch gar nichts.
Dafür habe ich noch was anderes gefunden. Wen ich eine Zeile bei DrawScene ausklammere, dann funktioniert es auch unter der VB. So wie es aussieht wird diese Funktion erst ab OpenGl 1.3 unterstützt.
Code:
// glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID0);
Kann es sein, das OpenGL 1.1 noch kein Multitexturing unterstütze ?
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Nu das ist alles etwas Tricky, wie gesagt BGRA muesste wenn denn BGRA_EXT sein oder so. Aber da solltest du lieber noch einmal genauer nachlesen. Ich kenne es halt nur mit RGBA. Vielleicht hast du also noch irgendwo nen anderen Fehler der sich dort hochschleicht.
Beim Thema Multitexturing setzt der richtige Brainfuck ein:
Garantiert funktioniert es nur wenn du über Blending mit mehreren Durchläufen arbeitest. Das ist dann aber natürlich etwas nervig von wegen der Reihenfolge beim Rendern.
Es ist aber sehr wahrscheinlich das dir hier Extensions von SGIS oder ARB fuer die bekannten Multitexturing Funktionen bereitstehen. Da musst du aber sehr aufpassen, denn soweit ich das noch weiß sind dort selbst die Namen der Texture-Units unterschiedlich und solche Geschichten.
Unter Lazarus, ist die TBitmap standardmässig im BGRA-Format.
Was mich verwundert ist, wieso im alten OpenGL ohne glTexParameterf-Parameter das Bild weiss blieb. Normalerweise müsste in einem Default-Format etwas kommen. So wie es scheint, ist die Mitmap-Einstellung etwas sehr wichtiges.
Was mich aber trotzdem verwundert, wieso hatte ich dazumal unter Delphi die Texturen so umständlich bei jedem Draw-Durchgang neu geladen. Was ich zugeben musste, dazumal hatte man kein Internet und keine Foren um die man um Hilfe bitten konnte. Irgendwie hatte man alles aus (schlechten) Bücher zusammen gestagelt. Bücher waren ohne Internet natürlich auch eine Rarität, da gab es kein Amazon, etc. Da hatte man zufällig in einem Warenhaus etwas gefunden.
Wenn keine Mipmaps generiert wurden, bekommt man ohne explizite Filterangabe mittels glTexParameteri nur eine weiße Ausgabe. Daher die Filter auf nicht-Mipmap-Werte setzen oder Mipmaps, z.B. mit GL_GENERATE_MIPMAPS erzeugen.
Der Grund ist, wenn die default-Filter (GL_LINEAR_MIPMAP_LINEAR oder sowas) angewandt werden, aber keine Mipmaps vorhanden sind, ist das genauso wie wenn die Texturdaten selber fehlen würden: weiß.
viele Grüße, 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 network • my 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
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Ich denke, im modernen OpenGL wird man für Mipmap sowieso immer glGenerateMipmap verwenden.
glGenerateMipmap sollte man eigentlich vermeiden.
Idealerweise werden die mipmaps offline in einem passenden Tool generiert (z.B. PowerVR TexTool) und dann direkt in die Datei gespeichert. Als Format bietet sich dafür dann z.B. KTX an, das kann alle möglichen Formate und unterstützt auch Cubemaps, Texture arrays, etc.
Dann kann man die Texture mit ihren mipmaps direkt in den Speicher laden ohne die mipmaps langsam und ohne Kontrolle über die Filter-Funktion via glGenerateMipmap generieren zu lassen.
Abgesehen davon dass das Laden dann viel schneller (und einfacher) geht, kann man die Qualität der mipmaps offline selbst beeinflussen.
Bei dynamischen Texturen kann man die mipmaps dann z.B. mit compute shadern zur Laufzeit erzeugen (je nach GPU sogar asynchron).
Idealerweise werden die mipmaps offline in einem passenden Tool generiert (z.B. PowerVR TexTool) und dann direkt in die Datei gespeichert. Als Format bietet sich dafür dann z.B. KTX an, das kann alle möglichen Formate und unterstützt auch Cubemaps, Texture arrays, etc.
Würde sie etwa ähnlich aussehen, wie eine *.ICO-Datei, welche auch Bilder in verschieden Grössen enthält ?
Zitat:
Abgesehen davon dass das Laden dann viel schneller (und einfacher) geht, k
Fällt dies so stark ins Gewicht ? Ein Textur muss man in der Regel nur einmal beim Rendern laden.
Das Ganze wäre aber sicher mal interessant auszuprobieren. Wie lädt man dies dann in das VRAM ?
Jetzt muss ich doch mal fragen, wie ist der einfachste Weg, um eine sehr einfache Textur hoch zu laden ? Oder gibt es noch etwas einfacheres ? So wie ich oben schon geschrieben habe, kann man glTexParameterf nicht weg lassen, ausser man nimmt glGenerateMipmap .
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
mathias hat geschrieben:
Fällt dies so stark ins Gewicht ? Ein Textur muss man in der Regel nur einmal beim Rendern laden.
Nur wenn alle deine Texturen in den (V)RAM passen, zusammen mit den ganzen anderen Daten und drei bis vier Framebuffer für Screen-Space-Effekte …
viele Grüße, 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 network • my 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
Nur wenn alle deine Texturen in den (V)RAM passen, zusammen mit den ganzen anderen Daten und drei bis vier Framebuffer für Screen-Space-Effekte …
Dann war der Weg der ich früher machte, das ich die Texturen bei jeden Draw-Durchgang neu ins VRAM ladete gar nicht so falsch. War dies nicht der ursprüngliche Weg, welcher bei den AGP-Karten vorgesehen war ?
Aber bei den heutigen Graka, sollte dies eigentlich kein Problem mehr darstellen, oder täusche ich mich da ?
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.