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

Aktuelle Zeit: Do Mär 28, 2024 20:10

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Aug 26, 2015 16:14 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
:( Guten Abend.
Ich versuche Cascaded Shadow Mapping zu implementieren. Dafür wollte ich eine gelayerte Tiefentextur verwenden und später mit sampler2DArrayShadow​ diese entsprechende Cascade auslesen. Leider scheitert es schon am Rendern der Tiefentextur.

Code:
  1.     int shadowBuffer[NUM_SHADOW_CASCADES], shadowCascade;
  2.  
  3.     glGenTextures(1, &shadowCascade);
  4.     glBindTexture(GL_TEXTURE_2D_ARRAY, shadowCascade);
  5.     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT, shadowMapSize, shadowMapSize, NUM_SHADOW_CASCADES, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
  6.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  7.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  8.  
  9.     glGenFramebuffers(NUM_SHADOW_CASCADES, shadowBuffer);
  10.  
  11.     for(i = 0; i < NUM_SHADOW_CASCADES; i++) {
  12.         glBindFramebuffer(GL_FRAMEBUFFER, shadowBuffer[i]);
  13.         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowCascade, 0, i);
  14.         printf("status at %d: %d\n", i, glCheckFramebufferStatus(GL_FRAMEBUFFER)); // immer 36053, also okay
  15.     }
  16.     glBindTexture(GL_TEXTURE_2D_ARRAY, 0);


Dort initialisiere ich alle Framebuffer-Objekte. Nun zum rendern:

Code:
  1.         updateCamera(deltaTime);
  2.         updateShadowCascades(NUM_SHADOW_CASCADES, shadowCascadeTransform); // berechnungen sind alle richtig
  3. // normal in den color buffer wird perfekt gerendert
  4.  
  5.  
  6.  
  7.         //glViewport(0.0, 0.0, shadowMapSize, shadowMapSize);
  8.         //glDisable(GL_TEXTURE_2D);
  9.  
  10.         for(i = 0; i < NUM_SHADOW_CASCADES; i++) {
  11.             glMatrixMode(GL_PROJECTION); // jaja ich weiß depricated, wird später noch geändert
  12.             glLoadMatrixf(shadowCascadeTransform[i]);
  13.             glBindFramebuffer(GL_FRAMEBUFFER, shadowBuffer[i]);
  14.             glDrawBuffer(GL_NONE);
  15.             glClear(GL_DEPTH_BUFFER_BIT);
  16.             glMatrixMode(GL_MODELVIEW);
  17.             glLoadIdentity();
  18.             glCallList(displayList);
  19.         }
  20.  


Wenn ich nun mit einem openGL debugger dran gehe, so sagt er mir, dass die FBOs an ihre entsprechenden Layer in der Textur gebunden sind. Gerendert wird jedoch immer in layer 0. Wenn ich nach schaue sehe ich exakt das bild der höchsten Cascade.

Was habe ich übersehen? :roll:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 16:58 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich denke du hast
Code:
  1. glBindTexture(GL_TEXTURE_2D_ARRAY, shadowCascade);
beim rendern vergessen.

Beim initialisieren bindest du die Textur mit
Code:
  1. glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
auf Null.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 17:53 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
mathias hat geschrieben:
Ich denke du hast
Code:
  1. glBindTexture(GL_TEXTURE_2D_ARRAY, shadowCascade);
beim rendern vergessen.

Beim initialisieren bindest du die Textur mit
Code:
  1. glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
auf Null.


Nein, daran lag es leider nicht. Wäre auch komisch, da die Textur ja scheinbar erreicht wird. Schließlich wird alles in den layer 0 gerendert. Außerdem war ich immer der Meinung, dass Texturen in die gerendert wird generell nicht gebunden sein sollten.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Setz mal bitte explizit folgende Texturparameter :
Code:
  1. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
  2. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, ...);


Ansonsten sieht der Code an sicht korrekt aus, evtl. noch prüfen ob glFramebufferTextureLayer einen GL_ERROR liefert.

Wie sehen denn deine Shader aus?

Hier gibts Quellcode der auch Layer verwendet, evtl. mal mit dem abgleichen.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 26, 2015 19:47 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Sascha Willems hat geschrieben:
Setz mal bitte explizit folgende Texturparameter :
Code:
  1. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
  2. glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, ...);


Ansonsten sieht der Code an sicht korrekt aus, evtl. noch prüfen ob glFramebufferTextureLayer einen GL_ERROR liefert.

Hat alles nichts geholfen und glFramebufferTextureLayer ist ohne Fehler zurück gekehrt.

Zitat:
Wie sehen denn deine Shader aus?

Momentan garkeiner vorhanden. Ist das notwendig? O_O

Zitat:
Hier gibts Quellcode der auch Layer verwendet, evtl. mal mit dem abgleichen.


Scheint auch irgendwie gleich zu sein. Das einzige was mich wundert ist, dass an glFramebufferTextureLayer wärend des Rendervorgangs aufgerufen wird. (siehe hier) Auch wenn ich so machen, selber Fehler :/


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 27, 2015 20:07 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Probiers mal mit einem simplen Shader mit einer layout location.

Wenn das dann immer noch nicht klappt, evtl. mal die OpenGL Debug Funktionalität verwenden und schauen ob der Treiber evtl. einen Hinweis liefert.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Aug 27, 2015 22:49 
Offline
DGL Member

Registriert: Mo Feb 15, 2010 18:09
Beiträge: 21
Programmiersprache: C++, Java
Nein nichts. Momentan habe ich alles soweit runter gebrochen, dass ich nur die glClear aufrufe und mit glClearDepth(0.5) eigentlich ein schön graues Bild sehen sollte. Ich untersuche das ganze mit gDebugger.

Code:
  1.     glEnable(GL_DEPTH_TEST);
  2.     glEnable(GL_CULL_FACE);
  3.  
  4.  
  5.  
  6.     int shadowBuffer, shadowCascade;
  7.  
  8.     glGenTextures(1, &shadowCascade);
  9.     glBindTexture(GL_TEXTURE_2D_ARRAY, shadowCascade);
  10.     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT, shadowMapSize, shadowMapSize, 2, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
  11.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER,     GL_NEAREST);
  12.     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER,     GL_NEAREST);
  13.  
  14.     glGenFramebuffers(1, &shadowBuffer);
  15.  
  16.     while(processMessages()) {
  17.         glViewport(0.0, 0.0, shadowMapSize, shadowMapSize);
  18.  
  19.         glBindFramebuffer(GL_FRAMEBUFFER, shadowBuffer);
  20.         glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowCascade, 0, 1);
  21.         printf("status: %d\n", glCheckFramebufferStatus(GL_FRAMEBUFFER));  // 36053 == GL_FRAMEBUFFER_COMPLETE
  22.         glClearDepth(0.5);
  23.         glClear(GL_DEPTH_BUFFER_BIT);
  24.  
  25.  
  26.  
  27.         SwapBuffers(windowDeviceContext);
  28.  
  29.     };
  30.  


Das Ergebnis ist folgendes: Mist
Die Jungs von nVidia scheinen es genau so zu machen. Habe mir mal ihre Demo für CSM runter geladen und den Quelltext verglichen.
Hier auch nochmal die calls bis zum ersten Frame vom Debugger aufgezeichnet.

Werde jetzt mal versuchen den Quelltext von nVidia zu kompilieren und dann nach und nach Dinge raus zu nehmen.


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


Wer ist online?

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