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

Aktuelle Zeit: Fr Apr 19, 2024 01:50

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [gelöst] Anfänger Shader
BeitragVerfasst: Mi Jun 17, 2015 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Hallo,

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:
  1. Vertexshader
  2.  
  3. const int LIGHT_COUNT = 2;          //Anzahl der berücksichtigten Lichter
  4. varying vec3 N;             //NormalenVektor
  5. varying vec3 V;             //VertexVektor 
  6. varying vec4 ecPos;            
  7. varying vec3 lightvec[LIGHT_COUNT]; //LichtVektor(en)
  8. void main(void)
  9. {
  10.     gl_TexCoord[0]  = gl_MultiTexCoord0;
  11.     N           = normalize(gl_NormalMatrix * gl_Normal);
  12.     V       = vec3(gl_ModelViewMatrix * gl_Vertex);
  13.     ecPos = gl_ModelViewMatrix * gl_Vertex;
  14.     for(int i = 0; i < LIGHT_COUNT; i++){
  15.         lightvec[i] = normalize(gl_LightSource[i].position.xyz - V);
  16.     }
  17.     gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;


Code:
  1. Fragmentshader
  2.  
  3. const int LIGHT_COUNT = 2;
  4. const float PI = 3.14159265;
  5. varying vec3 N;
  6. varying vec3 V;
  7. varying vec3 lightvec[LIGHT_COUNT];
  8. varying vec4 ecPos;
  9. uniform sampler2D Texture0;
  10. uniform sampler2D Texture1;
  11.  
  12. void main(void){
  13.     vec2 TexCoord = vec2(gl_TexCoord[0]);
  14.     vec3 Eye = normalize(-V);
  15.  
  16.     vec3 q0 = dFdx(Eye.xyz);
  17.     vec3 q1 = dFdy(Eye.xyz);
  18.     vec2 st0 = dFdx(TexCoord.st);
  19.     vec2 st1 = dFdy(TexCoord.st);
  20.  
  21.     vec3 S = normalize( q0 * st1.t - q1 * st0.t);
  22.     vec3 T = normalize(-q0 * st1.s + q1 * st0.s);
  23.  
  24.     mat3 M = mat3(-T, -S, N);
  25.     vec3 normal = normalize(M * (vec3(texture2D(Texture1, TexCoord)) - vec3(0.5, 0.5, 0.5)));
  26.  
  27.     vec4 EndColor = vec4(0.0, 0.0, 0.0, 0.0);
  28.     vec4 EndSpec  = vec4(0.0, 0.0, 0.0, 0.0);
  29.     for(int i = 0; i < LIGHT_COUNT; i++){
  30.         float distance = length(gl_LightSource[i].position - ecPos);
  31.         float attenuation = 1.0f / (gl_LightSource[i].constantAttenuation + gl_LightSource[i].linearAttenuation* distance +gl_LightSource[i].quadraticAttenuation * (distance * distance));
  32.         vec3 Reflected = normalize(reflect(-lightvec[i], normal));
  33.         vec4 IAmbient  = gl_LightSource[i].ambient  * gl_FrontMaterial.ambient;
  34.         vec4 IDiffuse  = gl_LightSource[i].diffuse  * gl_FrontMaterial.diffuse  * max(dot(normal, lightvec[i]), 0.0);
  35.         vec4 ISpecular = gl_LightSource[i].specular * gl_FrontMaterial.specular * pow(max(dot(Reflected, Eye), 0.0), gl_FrontMaterial.shininess);
  36.         IAmbient *= attenuation;
  37.         IDiffuse *= attenuation;
  38.         ISpecular *= attenuation;
  39.         EndColor += (IAmbient+IDiffuse);
  40.         EndSpec  += ISpecular;
  41.     }
  42.     EndColor += gl_FrontMaterial.emission;
  43.  
  44.     gl_FragColor = (gl_FrontLightModelProduct.sceneColor + EndColor + EndSpec) * texture2D(Texture0, TexCoord);
  45. }


Zuletzt geändert von Twist am Fr Jun 19, 2015 14:13, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Mi Jun 17, 2015 19:24 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Mi Jun 17, 2015 20:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Das ist ein alter Code ich habe inzwischen einiges getestet um ihn zum laufen zu bringen. Die Variable hört jetzt auf den Namen FracDist.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Mi Jun 17, 2015 21:48 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Do Jun 18, 2015 14:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Das mit der Farbe ist eine super Idee - danke.
Zitat:
Vielleicht hast du es schon oft genug gehört, aber der Vollständigkeit halber noch der Hinweis

Fürs rumtesten dachte ich geht es so.

Aber zur eigentlichen Frage wie berechnet man den Abstand Lichtquelle-Fragment?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Do Jun 18, 2015 18:50 
Offline
DGL Member
Benutzeravatar

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)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Anfänger Shader
BeitragVerfasst: Fr Jun 19, 2015 14:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 12, 2013 07:45
Beiträge: 61
Programmiersprache: Turbo Delphi 2006
Danke, ein Umstellen auf vec3 und es klappt.


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

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