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?
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)
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:
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:
lightvec = gl_Vertex.xyz-lightpos; //<--- Bei Per-Pixel-Berechnungen ist doch das Vertex unwichtig?
Code:
uniform vec4 lightcolor; //klar ;)
uniform vec3 lightsize; // Lichtgröße ?????
varying vec3 lightvec; //klar
void main()
{
vec3 a = lightvec / lightinvsize; //lightinvsize ?????
gl_Color = lightcolor * clamp(1.0 - dot(a,a),0.0,1.0) //Mehr oder weniger klar
}
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
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:
varying vec3 fragmentpos;
fragmentpos = gl_Vertex.xyz;
und dann im Fragment Shader den Lichtvektor berechnen:
Code:
varying vec3 fragmentpos;
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.
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
_________________ "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
Ö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!
_________________ "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
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.