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

Aktuelle Zeit: Fr Jul 18, 2025 11:07

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



Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 23:31 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Ich habe den Shader nochmal überarbeitet und noch ein klein wenig was eingebaut:
a) Das Licht kann über eine uniform-Variable ausgeschaltet werden, was denke ich doch schneller sein sollte, als einen Anderen shader zu binden
(natürlich kann man diese If-Abfrage auch einfach auskommentieren)
b) Fog hinzugefügt


VS:
Code:
  1.  
  2. varying vec3 position;
  3. varying vec3 normal;
  4.  
  5. void main(void)
  6. {
  7. gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  8. gl_FrontColor   = gl_Color;
  9. gl_TexCoord[0]  = gl_MultiTexCoord0;
  10. normal      = normalize(gl_NormalMatrix * gl_Normal);
  11. position        = vec3(gl_ModelViewMatrix * gl_Vertex);
  12. }
  13.  


FS:
Code:
  1.  
  2. uniform sampler2D Texture0;
  3. uniform int ActiveLights;
  4. uniform int EnableLighting;
  5.  
  6. varying vec3 position;
  7. varying vec3 normal;
  8.  
  9. void main(void)
  10. {
  11.   vec3 lightDir;
  12.   float  attenFactor;
  13.   vec3 eyeDir       = normalize(-position); // camera is at (0,0,0) in ModelView space
  14.   vec4 lightAmbientDiffuse  = vec4(0.0,0.0,0.0,0.0);
  15.   vec4 lightSpecular        = vec4(0.0,0.0,0.0,0.0);    
  16.  
  17.   // iterate all lights
  18.   for (int i=0; i<ActiveLights; ++i)
  19.   {
  20.     // attenuation and light direction
  21.     if (gl_LightSource[i].position.w != 0.0)
  22.     {
  23.         // positional light source
  24.         float dist      = distance(gl_LightSource[i].position.xyz, position);
  25.         attenFactor = 1.0 / (   gl_LightSource[i].constantAttenuation +
  26.                     gl_LightSource[i].linearAttenuation * dist +
  27.                     gl_LightSource[i].quadraticAttenuation * dist * dist );
  28.         lightDir        = normalize(gl_LightSource[i].position.xyz - position);
  29.     }     
  30.     else
  31.     {         
  32.         // directional light source        
  33.         attenFactor = 1.0;         
  34.         lightDir        = gl_LightSource[i].position.xyz;      
  35.     }     
  36.     // ambient + diffuse       
  37.     lightAmbientDiffuse     += gl_FrontLightProduct[i].ambient*attenFactor;    
  38.     lightAmbientDiffuse     += gl_FrontLightProduct[i].diffuse * max(dot(normal, lightDir), 0.0) * attenFactor;
  39.     // specular    
  40.     vec3 r      = normalize(reflect(-lightDir, normal));
  41.     lightSpecular   += gl_FrontLightProduct[i].specular *
  42.                   pow(max(dot(r, eyeDir), 0.0), gl_FrontMaterial.shininess) *
  43.                   attenFactor; 
  44.   }    
  45.   // compute final color   
  46.   vec4 texColor     = gl_Color * texture2D(Texture0, gl_TexCoord[0].xy);   
  47.   gl_FragColor  = texColor * (gl_FrontLightModelProduct.sceneColor + lightAmbientDiffuse) + lightSpecular;
  48.  
  49.   float fog     = (gl_Fog.end - gl_FogFragCoord) * gl_Fog.scale;            // Intensität berechnen
  50.   fog       = clamp(fog, 0.0, 1.0);  // Beschneiden
  51.   gl_FragColor  = mix(gl_Fog.color, gl_FragColor, fog);                 // Nebelfarbe einmischen
  52. }
  53.  


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


Zuletzt geändert von olee am Mo Feb 23, 2009 00:12, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 23:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
) Das Licht kann über eine uniform-Variable ausgeschaltet werden, was denke ich doch schneller sein sollte, als einen Anderen shader zu binden

Versuche nicht einen Universalshader zu schreiben, das ist der falsche Weg. Ein Shader sollte immer für genau die Aufgabe konzipiert sein die er ausführen soll.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 23:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Nur mein Problem ist:

Ich habe eine komplexe en.. hat sich erledigt hast recht... kam grad ne idee :lol:

MFG und nochmals DANKE für die Hilfe.

PS: Ich erstelle dann mal einen Wiki-Artikel^^
(Wie erstelle ich da eig einen neuen Eintrag ich finds nicht? (Angemeldet bin ich))


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 22, 2009 23:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Oh !!

Es war noch ein Fehler in deinem Code:
--> Die Abschwächung des Lichtes mit der Distanz wurde zwar berechnet, aber nicht angewendet.

Ich habe den Shader entsprechend im obigen Beitrag angepasst.

Außerdem habe ich die If-Struktur rausgenommen.

EDIT: Habe noch alle Integer-Werte (die auf meiner Graka ohne Probleme als Float interpretiert werden) zur Sicherheit
in feste Float-Werte (1.0) umgeschrieben.

MFG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 23, 2009 00:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
Ein neues Problem ist aufgetreten:

Wenn Texturing deaktiviert ist, dass ist alles Schwarz.

Das muss wohl hieran liegen:
Code:
  1.  
  2.   vec4 texColor     = gl_Color * texture2D(Texture0, gl_TexCoord[0].xy);   
  3.   gl_FragColor  = texColor * (gl_FrontLightModelProduct.sceneColor + lightAmbientDiffuse) + lightSpecular;
  4.  



Gibt es eine Möglichkeit herauszufinden, ob eine Textureunit aktiviert ist?

Denn ich weiß nicht wie ich das sons umgehen soll.
Vor allen da ich nicht einfach eine weiße textur oder so binden will, um sowas zu Umgehen.

Wobei:
Was meint ihr, wie groß die Performanceeinbußen wären von kein Texturing <> 1*1 Pixel - Weiße Textur?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 23, 2009 02:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Feb 21, 2008 22:10
Beiträge: 89
Wohnort: Boppard
So ich habe einen Artikel zu diesem Shader im Wiki erstellt:
http://wiki.delphigl.com/index.php/shader_PerPixel_Lighting :arrow:

Feedback erwüncht. :P

MFG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Feb 23, 2009 11:15 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Es war noch ein Fehler in deinem Code:
--> Die Abschwächung des Lichtes mit der Distanz wurde zwar berechnet, aber nicht angewendet.

Hatte das und auch noch einige andere Sachen bei meinem Shader noch nachträglich korrigiert. (Da steht irgendwo "Edit: Alle bisher genannten Fehler oben korrigiert.")

Ich glaube nicht das du eine Unterscheidung zwischen Textur und nicht Textur benötigst. Man hat normalerweise einfach immer ne Textur drauf. Und nochmal...vermeide den Universalshader, es gibt einfach soviele Dinge die man da einbauen könnte, das geht einfach nicht...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 37 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 15 Queries | GZIP : On ]