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

Aktuelle Zeit: Do Mär 28, 2024 19:45

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



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Texturen mit OpenGL 1.1
BeitragVerfasst: So Jun 11, 2017 17:39 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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:
  1.   pic := TPicture.Create;
  2.   pic.LoadFromFile('project1.ico');     // Es gehen auch jpg/bmp/ico
  3.  
  4.   Caption:=IntToStr(pic.Width);
  5.  
  6.   with pic.Bitmap do begin
  7.     glGenTextures(1, @textureID0);
  8.     glBindTexture(GL_TEXTURE_2D, textureID0);
  9.  
  10.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, RawImage.Data);
  11.  
  12.     glGenerateMipmap(GL_TEXTURE_2D); // Hier schmiert es ab.
  13.   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:
  1. procedure TfrmCube.DrawScene;
  2. begin
  3.   glNewList(11, GL_COMPILE);
  4.     glBegin( GL_QUADS );
  5.     glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1,  1 );
  6.     glTexCoord2f( 1.0, 0.0 ); glVertex2f(  1,  1 );
  7.     glTexCoord2f( 1.0, 1.0 ); glVertex2f(  1, -1 );
  8.     glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1, -1 );
  9.     glEnd;
  10.   glEndList;
  11.  
  12.   glEnable(GL_DEPTH_TEST);
  13.   glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  14.   glMatrixMode(GL_MODELVIEW);
  15.   glDepthFunc( GL_LEQUAL );
  16.  
  17.   glLoadIdentity;
  18.  
  19.   glEnable( GL_TEXTURE_2D );
  20.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  21.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  22.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  23.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  24.  
  25.   glTranslatef(0, 0, Distanz);
  26.   glRotatef(winkel1, 1, 0, 0);
  27.   glRotatef(winkel2, 0, 1, 0);
  28.   glRotatef(winkel3, 0, 0, 1);
  29.  
  30.   glTranslatef(0, 0, 1.0);
  31.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, @t[0]);
  32.   glCallList(11);
  33.   glTranslatef(0, 0, -2.0);
  34.   glTexImage2D(GL_TEXTURE_2D, 0, 3, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, @t[1]);
  35.   glCallList(11);
  36.  
  37.   SwapBuffers(DC);
  38. end;

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: So Jun 11, 2017 17:53 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 460
Programmiersprache: C / C++ / Lua
gluBuildMipmaps2D oder so.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: So Jun 11, 2017 19:17 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.
Code:
  1.  with pic.Bitmap do begin
  2.     glGenTextures(1, @textureID0);
  3.     glBindTexture(GL_TEXTURE_2D, textureID0);
  4.  
  5.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  6.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  7.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  8.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  9.  
  10.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_BGRA, GL_UNSIGNED_BYTE, RawImage.Data);
  11.  
  12. //    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, RawImage.Data);
  13. //    glGenerateMipmap(GL_TEXTURE_2D);
  14.   end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 17:17 
Offline
DGL Member
Benutzeravatar

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.


Code:
  1.  
  2.  
  3.         glTexImage2D( GL_TEXTURE_2D, 0, ...
  4.  
  5.         if (mipmap)
  6.     {
  7.  
  8.  
  9.         for(int i=0;size > 1;i++)
  10.         {
  11.              SkalierenDerDaten(...
  12.              glTexImage2D( GL_TEXTURE_2D, i, ....
  13.         }
  14.  
  15.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
  16.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  17.     }
  18.     else
  19.     {
  20.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  21.         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  22.     }
  23.  


[edit]
Viel Spass noch mit SGIS vs ARB :P

[edit2]
Achja BGR und BGRA war eine Extension! Schau dir am besten mal die MSDN Doku von Opengl an. Die ist in deinen Fall richtiger als Kronos :P

_________________
Meine Homepage


Zuletzt geändert von yunharla am Mo Jun 12, 2017 17:42, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
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.

Code:
  1.   with pic.Bitmap do begin
  2.     glGenTextures(1, @textureID0);
  3.     glBindTexture(GL_TEXTURE_2D, textureID0);
  4.  
  5.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Width, Height, 0, GL_BGRA, GL_UNSIGNED_BYTE, RawImage.Data);
  6.  
  7.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  8.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  9.  
  10.     //    glGenerateMipmap(GL_TEXTURE_2D);
  11.   end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 17:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Siehe meinen letzten Edit. BGRA ist vermutlich nicht supported.

Und mit Skalieren meine ich, das du die einzelnen Mipmap Stufen selber baust. :)

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 17:54 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
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:
  1. //  glActiveTexture(GL_TEXTURE0);
  2.  glBindTexture(GL_TEXTURE_2D, textureID0);
  3.  

Kann es sein, das OpenGL 1.1 noch kein Multitexturing unterstütze ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 18:03 
Offline
DGL Member
Benutzeravatar

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.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 19:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Code:
  1.  Ich kenne es halt nur mit RGBA.

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. :shock:

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. :roll:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 20:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das mit den Mipmap-Einstellungen ist sogar in unserer Checkliste Texturierung:
Checkliste Texturierung hat geschrieben:
  • Sind die Filter der Textur richtig gesetzt?

    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 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: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Mo Jun 12, 2017 21:41 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Unterdessen bin ich dank eurer Hilfe ein bisschen schlauer geworden. :idea:
So wie ich sehe, ist in Sache Texturing in den letzen Jahren auch viel gegangen. :shock:

Ich denke, im modernen OpenGL wird man für Mipmap sowieso immer glGenerateMipmap verwenden.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Do Jun 15, 2017 08:54 
Offline
DGL Member
Benutzeravatar

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).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Do Jun 15, 2017 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
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. :idea:
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 .


Code:
  1.   glGenTextures(1, @textureID1);
  2.   glBindTexture(GL_TEXTURE_2D, textureID1);
  3.  
  4.   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, @Textur32);
  5.  
  6.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  7.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Do Jun 15, 2017 17:44 
Offline
DGL Member
Benutzeravatar

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 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: Re: Texturen mit OpenGL 1.1
BeitragVerfasst: Do Jun 15, 2017 19:26 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
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 ?

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 18 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.079s | 17 Queries | GZIP : On ]