ich habe mich jetzt mit Shadern etwas beschäftigt und wollte dem Bumpmapping-Shader von der Shadersammlung den Licht-Attenuation-Faktor beibringen. Die CONSTANT_ATTENUATION klappt auch aber LINEAR-& QUADRATIC_ATTENUATION wollen nicht. Egal was für einen Wert ich eingebe (1 - 0.000001) es tut sich nichts. Deshalb denke ich Distanzberechnung Lichtquelle-Fragment stimmt nicht. Kann bitte mal jemand mit Wissen drüberschauen? Ich habe ja höchstens eine Ahnung. Kann man Shader eigentlich debuggen oder berechnete Werte anzeigen lassen? Ja es wird für jeden Pixel berechnet aber vielleicht hat jemand einen Trick auf Lager.
Code:
Vertexshader
constint LIGHT_COUNT =2;//Anzahl der berücksichtigten Lichter
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Bist du sicher, dass der Fragmentshader überhaupt korrekt kompiliert? Du nennst eine Variable distance. distance ist aber schon der Name einer vordefinierten Funktion. Meines Erachtens ist das nicht erlaubt. Daher baue mal absichtlich einen Fehler ein (z.B. irgendwo in den Code "fzar rfphkikgvnh" schreiben) und gucke, ob dein OpenGL-Programm das überhaupt mitbekommt.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Okay, wenn du sicher bist, dass dein Code ordentlich compiliert und linkt, nun zu deinen anderen Fragen (Abgesehen von Attenuation funktioniert doch alles, oder?):
Breakpoint setzen und einfach Variablen auslesen geht leider nicht (jedenfalls ist mir kein derartiges Debugging-Programm für GLSL bekannt). Es laufen ja auch immer hunderte Instanzen des Fragmentshaders gleichzeitig, dementsprechend müsstest du angeben, welchen davon du denn gerade anhalten willst.
Du kannst dir attenutation, FracDist oder beliebige andere Variablen aber als Farbe ausgeben lassen. Dazu solltest du dir natürlich erstmal überlegen, in welchem Bereich die Werte der Variablen zu erwarten sind. Die Werte musst du dann runterskalieren und in den Bereich 0.0 bis 1.0 bringen (1.0f gibt es übrigens nicht in GLSL). Wenn du dich etwas im Farbraum auskennst, kannst du auch eine Variable in den Rot, eine weitere in den Grün-Kanal schreiben usw., solange du dabei die Übersicht behälst. Wichtig ist, wenn du einmal eine Variable zum Debuggen in gl_FragColor geschrieben hast, dass du sie nicht wieder mit was anderem überschreibst (z.B. durch Iteration der for-Schleife). Also zum Debuggen erstmal nur 1 Licht betrachten, die interessanten Variablen als Farbe ausgeben und alles, was normalerweise danach käme, auskommentieren.
Vielleicht hast du es schon oft genug gehört, aber der Vollständigkeit halber noch der Hinweis: Was du da mit GLSL machst, war vor 10 Jahren aktuell. Modernes OpenGL kennt weder gl_LightSource mit all seinen Eigenschaften, noch gl_FrontMaterial oder gl_ModelViewMatrix. Das heißt man muss heute weniger Variablennamen und deren Bedeutung auswendiglernen, dafür muss man sich aber auch sein Beleuchtungsmodell & Matrixstack selbst implementieren (oder eine fertige Implementierung suchen). Man ist also flexibler, hat aber auch initial mehr Aufwand. Du kannst natürlich selbst entscheiden, ob du bei OpenGL 2 bleibst (und auf Vulkan wartest) oder nicht, aber nur dass du dich nicht in einem Jahr ärgerst, dass du dir völlig überholtest Wissen angeeignet hast.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Twist hat geschrieben:
Aber zur eigentlichen Frage wie berechnet man den Abstand Lichtquelle-Fragment?
Im Code oben berechnest du den Abstand zweier vec4-Vektoren. Wenn die w-Koordinaten gleich sind geht das gut. Wenn nicht, führt das zu Fehlern. Am besten ist, du beziehst jeweils nur .xyz in die Längenberechnung ein. Ansonsten sieht die Berechnung aber in Ordnung aus.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Mitglieder in diesem Forum: Google [Bot] 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.