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

Aktuelle Zeit: Mi Jul 23, 2025 11:57

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Per-Pixel Lighting
BeitragVerfasst: So Aug 15, 2004 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Hallo!
Ich fang jezt auch mal mit Shadern an und hab auch shcon ne Frage.
Es reden ja alle immer davon, dass man mit Shadern ganz toll ein Per-Pixel Lighting machen kann.
Aber ich hab einfach keine Peilung, wie ich das machen soll... (das Tutorial hab ich shcon gelesen)
KAnn mir jemand nen Tip geben, wie ich das anstell?
Gibt es zum Per-Pixel Lighting Tutorials?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Aug 15, 2004 14:15 
Offline
DGL Member

Registriert: Do Mai 13, 2004 16:36
Beiträge: 116
Wohnort: Deutsch-Wagram (Österreich)
Per-Pixel Lighting ist eigentlich das selbe wie per-Vertex Lighting. Du musst die Berechnungen einfach aus dem Vertex Shader in den Pixel Shader verschieben. Hier gibt es einiges über Beleuchtung: http://www.wolfgang-engel.info/direct3d.net/.

_________________
Diese Signatur ist defekt. Bitte wählen Sie die Numer 12846712894671893230917497617383216 (gültig ab 32.13.2671)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Aug 16, 2004 10:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Unter OpenGL schreibt man dazu einen Vertex Shader und einen Fragment Shader. Das ist recht einfach, weil es mit so einer C ähnlichen Sprache glsl funktioniert. Diese Shader übergibt man dann als String an die jeweiligen OpenGL Funktionen und die Programme werden dann für jeden Vertex bzw. für jedes Fragment/jeden Pixel ausgeführt.

uniform sind Variablen die vom Programm gesetzt werdem.
varying sind Variablen die im VertexShader geschrieben, dann interpoliert und für im Fragment Shader gelesen werden.


Ein einfacher Shader, der nur die Entfernung vom Licht berücksichtigt, könnte z.B. so aussehen:


VertexShader:

Code:
  1.  
  2. varying vec3 lightvec;
  3. uniform vec3 lightpos;
  4. void main()
  5. {
  6.     lightvec = gl_Vertex.xyz-lightpos;
  7.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  8. }



FragmentShader:

Code:
  1.  
  2. uniform vec4 lightcolor;
  3. uniform vec3 lightsize;
  4. varying vec3 lightvec;
  5. void main()
  6. {
  7.     vec3 a = lightvec / lightinvsize;
  8.     gl_Color = lightcolor * clamp(1.0 - dot(a,a),0.0,1.0)
  9. }


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 06, 2005 12:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Sorry, dass ich diesen alten Thread wiederbelebe, aber warum einen neuen aufmachen?
Da ich nun begonnen habe, glSlang zu erlernen, habe ich mir gleich mal ein paar Aufgaben gesucht, die ich dann nacheinander abarbeiten wollte. Nachdem ich (glaube ich) das Prinzip und die Arbeitsweise der Shader verstanden habe, wollte ich mal eine simple Per-Pixel-Lichtberechnung machen. Aber da fangen die ersten Probleme an.
Bei meiner Planung habe ich mich an diesem Thread (!), dem Phong-Artikel auf Delphi3D.net und Saschas glsl-Tut orientiert.
Nachdem mir letztere mathematisch völlig klar sind, hab ich jetzt Probleme in der Umsetzung. Mir ist nämlich nie (!) klar, aus welchem Bezugssystem ich welchen Vektor berechnen soll.
Zum Beipsiel:
Code:
  1.  
  2.     lightvec = gl_Vertex.xyz-lightpos;      //<--- Bei Per-Pixel-Berechnungen ist doch das Vertex unwichtig?
  3.  


Code:
  1.  
  2. uniform vec4 lightcolor;                        //klar ;)
  3. uniform vec3 lightsize;                         // Lichtgröße ?????
  4. varying vec3 lightvec;                          //klar
  5. void main()
  6. {
  7.     vec3 a = lightvec / lightinvsize;         //lightinvsize ?????
  8.     gl_Color = lightcolor * clamp(1.0 - dot(a,a),0.0,1.0)   //Mehr oder weniger klar
  9. }



EDIT: Das größte Problem ist, das bei den meisten Artikeln zu diesem Thema im Internet immer nur der Code einfach so hingeklatscht wird. Diese funktionieren dann weder per Copy&Paste (man kann ja dann schrittweise nachvollziehen), noch versteht man die Hintergründe. Und bei theoretischen Artikeln (zB der vom Delphi3D.net) vermisse ich dann den praktischen Teil...

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 06, 2005 14:10 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
1) Um den Vektor vom Licht zu einem Punkt zu berechnen muß man natürlich die Position des Punktes im Fragment Shader haben. Man könnte also die Position über eine varying Variable interpolieren.

Code:
  1. varying vec3 fragmentpos;
  2.  
  3. fragmentpos = gl_Vertex.xyz;



und dann im Fragment Shader den Lichtvektor berechnen:

Code:
  1. varying vec3 fragmentpos;
  2.  
  3. vec3 lightvec = fragmentpos - lightpos;


Aber man kann sich die Subtraktion im Fragment Shader auch sparen, weil sie da natürlich viel öfter als im Vertex Shader ausgeführt wird und den Lichtvektor gleich im Vertex Shader ausrechnen und interpolieren.
Die Interpolation der varying Variablen ist, bezogen auf die Welt, eine lineare Funktion. Daher gilt für f(fragmentpos - lightpos)=f(fragmentpos) - f(lightpos)=f(fragmentpos) - lightpos

2) Ja da muß natürlich / lightsize hin oder man dividiert das schon im Programm selber und schreibt das dann in eine andere Variable. Soweit ich weiß, werden Ausdrücke die nur auf uniform Variablen basieren, wie 1/lightsize momentan noch nicht durch den Treiber aus dem Shader herausgenommen und vorher berechnet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 06, 2005 14:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
AAHHHHHHHHHHHHHH, mir geht ein Licht auf!
Da wär ich ja nie draufgekommen, dass der Fragment-Shader durch die Interpolation (was mir übrigens ein schleierhafter Begriff ist) der Vertex-Shader-Werte Pixel-genaue Werte bekommt. Das muss ich natürlich gleich ausprobieren 8)

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 06, 2005 16:04 
Offline
DGL Member

Registriert: Sa Sep 21, 2002 21:32
Beiträge: 346
Wohnort: Eilsum (Nahe Emden)
Öhm .... ja
Also ich hab zu dem thema auch noch eine Frage: Die Code-Fragmente sehen sehr logisch aus, aber wie darf man das mit den Uniform-Variablen verstehen ... ich mein: Man übergibt ja nun die Position des Lichtes an die Shader, aber wie stellt man das an, wenn man nicht nur ein Licht haben möchte?

_________________
Es sind immer die guten,
welche zu früh von uns gehen müssen...

Meine bislang 13 Open Gl - Tuts findet ihr auf www.dcw-group.net
Neu! Ein großer Teil der Demos nach Kylix übersetzt!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 06, 2005 16:19 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 17, 2002 12:07
Beiträge: 976
Wohnort: Tübingen
Da kann sogar ich dir helfen: http://www.delphigl.com/forum/viewtopic.php?t=3622
Ich glaub, da ist es genau um das Thema gegangen.

_________________
"Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0."
- Hal Faber

Meine Homepage: http://laboda.delphigl.com


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


Wer ist online?

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