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

Aktuelle Zeit: Sa Apr 17, 2021 16:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Custum MipMap
BeitragVerfasst: Sa Jun 17, 2017 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1211
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich versuche gerade eine MipMap manuell zu erzeugen.
Nur wird mir immer nur die 1. Textur angezeigt.
Was mache ich falsch ?

Die Texturen sind unterschiedlich, das beweist, wen ich mit
Code:
  1.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
  2.  
die Starttextur ändere.

Mit folgendem Code lade ich die Texturen:
Code:
  1. procedure TForm1.InitScene;
  2. const
  3.   maxLevel = 4;
  4. var
  5.   tex: array of UInt32;
  6.   w, i, j: integer;
  7. begin
  8.   // ------------ Texture laden --------------
  9.   glGenTextures(1, @textureID0);
  10.   glBindTexture(GL_TEXTURE_2D, textureID0);
  11.  
  12.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  13.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  14.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  15.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  16.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxLevel - 1);
  17.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
  18.  
  19.   glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  20.  
  21.   for i := 1 to maxLevel do begin
  22.     w := (1 shl i) * 16;
  23.     SetLength(tex, w * w);
  24.     for j := 0 to Length(tex) - 1 do begin
  25.       tex[j] := $FF shl (4 * i) + (j mod 255);
  26.     end;
  27.     glTexImage2D(GL_TEXTURE_2D, i - 1, GL_RGBA, w, w, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pointer(tex));
  28.   end;
  29.  
  30.   glBindTexture(GL_TEXTURE_2D, 0);

Im Anhang habe ich noch die ganze Source.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Custum MipMap
BeitragVerfasst: So Jun 18, 2017 19:24 
Offline
DGL Member

Registriert: Fr Mai 11, 2012 13:25
Beiträge: 229
Programmiersprache: c++, c, JavaScript
Wie lässt Du Dir die Mipmaps denn anzeigen?
Du setzt in deinem Beispiel den MIN_FILTER erst auf linear_mipmap_linear, dann auf NEAREST.
Somit deaktivierst Du das mipmapping.
Du kannst die Mipmaps trotzdem explizit binden und auch via textureLod im shader abrufen.
Falls das nicht klar war: Die mipmaps sind nicht Teil des 0ten Levels, also der Ur-Textur sondern separate kleinere Versionen der Textur.

_________________
"Pixel, ich bin dein Vater."
-Darf Shader


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Custum MipMap
BeitragVerfasst: So Jun 18, 2017 22:09 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1211
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Wen ich es so mache, wie hier: https://gamedev.stackexchange.com/questions/84398/texture-is-black-when-manually-building-mipmap
Dann bekomme ich nur eine schwarze Textur gezeigt.

Füge ich aber
Code:
  1. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
ein, dann bekomme ich wenigstens die erste Textur.

Zitat:
Du kannst die Mipmaps trotzdem explizit binden und auch via textureLod im shader abrufen.

Ich habe noch folgendes probiert, aber dies verändert nichts an der Ausgabe, auch wen ich einen anderen Wert als "2" in die letzte Zeile schreibe.
Code:
  1. #version 330
  2.  
  3. in vec2 UV0;
  4.  
  5. uniform sampler2D Sampler;
  6.  
  7. out vec4 FragColor;
  8.  
  9. void main()
  10. {
  11. //  FragColor = texture( Sampler, UV0 );
  12.   FragColor = texture2DLod (Sampler, UV0, 2);
  13. }


Zitat:
Falls das nicht klar war: Die mipmaps sind nicht Teil des 0ten Levels, also der Ur-Textur sondern separate kleinere Versionen der Textur.

Aus diesem Grund schreibe ich verschieden grosse Texturen mit der For-Schleife ins VRAM.

Ich kann googlen so viel ich will, aber es kommt einfach nichts gescheites.
Als Suchbegriff habe ich folgende verwendet: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL,

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Custum MipMap
BeitragVerfasst: Di Jun 20, 2017 14:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Nun, deine Textur kann auch niemals komplett werden da du die Regeln fürs Mipmapping verletzt. Denn mit Ausnahme von Arrays müssen alle Texturen eine konsistente Größe haben. Das bedeutet:

Code:
  1.  
  2. round_down(base_size / (2 ^ mipmap-level))
  3.  


Bei Arrays ist es im Prinzip gleich. Nur das du halt die Layers gleich bleiben müssen.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Custum MipMap
BeitragVerfasst: Di Jun 20, 2017 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1211
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Juhe jetzt klappt es. :shock:
Mein grösster Fehler war, das ich zuerst die kleinste, anstelle der grössten Textur ins VRAM geladen habe.

Code:
  1.   glGenTextures(1, @textureID0);
  2.   glActiveTexture(GL_TEXTURE0);
  3.   glBindTexture(GL_TEXTURE_2D, textureID0);
  4.  
  5.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, maxLevel - 1);
  6.   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
  7.  
  8.   for i := 1 to maxLevel do begin
  9.     w := (1 shl (maxLevel - i)) * 256;
  10. //    w := (1 shl i) * 256; // Dies war falsch !
  11.     SetLength(tex, w * w);
  12.     for j := 0 to Length(tex) - 1 do begin
  13.       tex[j] := $FF shl (4 * i) + (j mod 255);
  14.     end;
  15.     glTexImage2D(GL_TEXTURE_2D, i - 1, GL_RGBA, w, w, 0, GL_RGBA, GL_UNSIGNED_BYTE, Pointer(tex));
  16.   end;  

Im Fragment-Shader, ist die "-4" bei Texture noch wichtig, wen man diese weglässt, veränder sich die Textur nicht.
Dies hatte ich zufällig gefunden, meistens hat texture nur 2 Parameter,
Code:
  1. #version 330
  2. in vec2 UV0;
  3. uniform sampler2D Sampler;
  4. out vec4 FragColor;
  5.  
  6. void main()
  7. {
  8.   FragColor = texture( Sampler, UV0, -4 );
  9. }  

So wie es aussieht, müssen da recht viele Sachen zusammenspielen, das dies überhaupt funktioniert.

Aber es macht trotzdem Spass immer wieder was neues zu probieren. :wink:

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Custum MipMap
BeitragVerfasst: Do Jun 22, 2017 21:52 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1211
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Irgend etwas stimmt noch nicht, es wird nur ein Quadrat gezeichnet.
Entferne ich aber den Kommentar bei FragColor, dann werden wie erwartet 2 weise Quadrate gezeichnet.

Was mache ich falsch, das mit Textur nur ein Quadrat gezeichnet wird ?

Code:
  1. #version 330
  2. in vec2 UV0;
  3. uniform sampler2D Sampler;
  4. out vec4 FragColor;
  5.  
  6. void main() {
  7.   FragColor = texture( Sampler, UV0, -5 );
  8. //  FragColor = vec4(1.0);
  9. }


PS: Wen ich das Render-Fenster stark verkleinere und eine optimale Proportion hat, dann erscheint auf einmal das 3. Quadrat. :roll:


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] 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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.055s | 18 Queries | GZIP : On ]