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

Aktuelle Zeit: Di Jul 15, 2025 05:49

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: textureCube und GL_INVALID_OPERATION
BeitragVerfasst: Di Mär 02, 2010 18:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich steh grad vor ner Wand und seh die Steine nicht, zumindest kommt es mir so vor.

Im meinem Prototypen für den Dungeoncrawler hab ich bereits normales Shadowmapping für eine gerichtete Lichtquelle via GLSL implementiert. Funzt auch genauso wie es soll. Nun wollt ich das auf Punktlichter erweitern und render daher die Tiefenwerte in eine Cubemap (was laut passender Debugausgabe auch klappt) und will nun im Shader mittels folgender Zeile auf diesen korrekt zugewiesenen Sampler zugreifen :
Code:
  1. vec4 depth = textureCube(ShadowCubeMap, -lightDirection.xyz);

Und nun passiert was Kurioses : Allein obige Zeile reicht um meine komplette Szene schwarz erscheinen zu lassen, obwohl ich "depth" nirgendwo auf gl_FragColor zuweise. Und ausserdem bekomm ich dann auch noch ne GL_INVALID_OPERATION.

Das alles ist mir sehr suspekt, zumal obige Zeile ja nix an der Optik ändern sollte und eine Zeile im Shader (der korrekt kompiliert und gelinkt wirds) auch kein GL_INVALID_OPERATION bringen dürfte.

Hab ich da was übersehen, oder isses ein Treiberproblem (Vista 64, ATI Radeon 4850, Treiber 9.12). Ich werd nämlich langsam bekloppt, da ja eigentlich nix passieren sollte.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 18:52 
Offline
DGL Member

Registriert: Do Jun 28, 2007 17:58
Beiträge: 193
Programmiersprache: Pascal, C
Überschreitest du vielleicht irgendein Textur-Lookup Limit im Shader Model? Wenn du nirgends das Ergebnis zuweist, sehe ich nicht, weshalb es sonst Probleme geben sollte. Wird der Code korrekt übersetzt? Was sagen dort die Ausgaben?

_________________
http://audorra.sourceforge.net//http://andorra.sourceforge.net


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 18:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ich hab nur drei Texturelookups drinne (Color, Normal und Heightmap) und der Shaderlog ist sauber. Ist übrigens lustig, auch wenn ich sowas mach :
Code:
  1.  if (useShadowMap == 1)
  2.   {
  3.    vec4 depth = textureCube(ShadowCubeMap, -lightDirection.xyz);
  4.    gl_FragColor.r = depth.r;
  5.    gl_FragColor.g = 1.0;
  6.   }
  7.  

Bekomme ich ein schwarzes Bild und den Fehler, auch wenn ich useShadowMap auf 0 setz...

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 02, 2010 21:06 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hier mal paar Fragen:
- Ist deine ShadowCubeMap vielleicht leer?
- ist die LightDirection 0,0,0?
- muss LightDirection normalisiert sein?

Ich denke sowas in die Richtung läuft falsch, da es sich um einen Runtime-Error handelt. D.h. ich denke dein Treiber erkennt, dass der Shader in einen undefinierten Zustand kommen könnte und bricht ab.

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 03, 2010 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Mär 09, 2005 15:54
Beiträge: 372
Wohnort: München
Programmiersprache: Delphi, C#, FPC
Ich denke, die Shadow-Cube-Map hat den Typ GL_DEPTH_COMPONENT. Wie schaut es denn aus, wenn du im Shader folgendes machst:

Code:
  1. if (useShadowMap == 1)
  2. {
  3.    // Float-Typ und kein Vektor mehr
  4.    float depth =
  5.       // nur den R-Wert (da der Typ ja GL_DEPHT_COMPONENT ist, kommt da der komplette Float-Wert raus)
  6.       textureCube(ShadowCubeMap, -lightDirection.xyz).r;
  7.  
  8.    ...
  9. }

_________________
Aktuelles Projekt: Gael - Development Blog
Website: LightBlackSoft.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 03, 2010 15:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nur so eine Idee, ich habe aber gerade keine Spec zur Hand um die Theorie zu prüfen:
Wäre es möglich das es textureCube erst seit einer bestimmten GLSL-Version gibt und deine Grafikkarte diese Version nicht beherrscht, der Treiber aber wohl? Wäre zumindest eine Erklärung für den schwarzen Bildschirm. Ggf. versuchst du mal die richtige GLSL-Version über "#version" Kommando zu erzwingen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 09:45 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Danke für die Tipps, aber nach ewiger Rumprobiererei bin ich der festen Meinung das hier ein Treiberbug vorliegt. Wenn ich im Shader soweit alles ausklammer und dann von der Cubemap sample klappt es wunderbar. Lasse ich alles andere drin (der Shader macht halt Parallax Mapping und Shadow Mapping) dann gehts, und ich kann die Werte auslesen (ja, es ist GL_DEPTH_COMPONENT), egal ob in einen float oder einen Vektor. Was genau hier passiert werd ich dann wohl prüfen müssen, die Shaderlogs geben jedenfalls keinerlei Auskunft.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 10:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
vielleicht hilft dir das weiter: http://stackoverflow.com/questions/462721/rendering-to-cube-map

Ausprobiert habe ich das nicht. Als ich selbiges vor über einem Jahr probierte bekam ich die Antwort, dass es nicht möglich sei, eine cubemap mit depth Komponente zu erzeugen und zu beschreiben (berichtet wurde, dass die Szene schwarz bleibt, ALLERDINGS: mit Error-Meldung wegen fehlerhaft erzeugtem FBO).
Allerdings haben sich ja viele Dinge seit dem geändert und ob die Aussage richtig war kann ich auch nicht sagen. Aber bei obiegem Link scheint das Problem gelöst worden zu sein.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 10:48 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Wei gesagt klappt die Depthcubemap wunderbar (icn nutze dafür momentan aber auch kein FBO). Ich lass mir ja jede Seite im 2D-Overlay anzeigen, und da ist auch drin was rein soll. Es scheint hier wirklich was mit der Kombination dessen was ich im Shader mache zu tun zu haben. Ist ja nicht das erste Mal, hab schon zwei Shaderbugs an ATI gemeldet die damals auch gefixt wurden (u.a. dass gl_FragCoord nach auslesen von gl_Fog nicht mehr ging). Werd ich halt mal genau nachsehen worans liegt, und dann ggf. Multipass machen wenns ned klappt.

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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 04, 2010 18:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Nach stundenlangem rumprobieren hab ichs aufgegeben. Depthcubemaps und Shader scheinen auf ATi wohl (noch?) nicht so 100%ig zusammenzupassen, oder es ist evtl. nicht vorgesehen etwas so zu machen wie ich es machen will.

Also hab ichs anders gemacht. Die Cubemap ist jetzt eine normale Cubemap mit RGBA-Werten (also GL_RGBA statt GL_DEPTH_COMPONENT) und ich nutze einen eigenen Shader der selbst Tiefeninformationen in die RGBA-Cubemap schreibt (was evtl. nicht schlecht ist, da ich so rein theoretisch bis zu 4 Lichtquellen in einer Cubemap unterbrigen kann), mit diesen Tiefeninformationen vergleiche ich dann einfach im Shader fürs normalen Szenenrendering.

Ist zwar ein kleiner Umweg, aber es funktioniert tadellos, und mein Testobjekt wirft schöne Echtzeitschatten in alle Richtungen.

Edit : Screenshot (Thumb, klick mich!) :
Bild

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


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


Wer ist online?

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