Ich habe eine Fragen bezüglich der Vektoren, die man für die verschiedenen Lichtmodelle braucht. Ins besondere
meine ich damit Vektoren wie Blickrichtung,CameraPosition und Lichtposition. Wo bekomme ich die her? Bei dem Licht stellt
sich für mich eher die Frage, ob ich das openGL Licht verwende, oder einfach ein eigenes schreibe und dann die Vektoren (Position,Ambient,Diffuse und Specular) als uniform
an den Shader schicke. Die eigenen wären praktisch, weil ich sie Formeltechnisch schnell modifizieren kann wie ich möchte, dafür sind die oGL Lichter bereits bestandteil der GLSL und ich spare mir die vielen uniforms.
Ich hatte mal in openGL ein Goroud-Licht geschrieben, das basierte aber komplett auf eigene Objekte und beleuchtete eine Fläche nur
in Abhängigkeit zur Flächennormale, d.h. es war nicht nur eine vereinfachte Beleuchtung, sondern ich wusste aufgrund der komplett selbst geschriebenen Objekte (Licht,Camera), was sich wo in welchem Format befindet. Außerdem wurde die Färbung per gl_color3f(); angestellt, was denke ich ebenfalls eine unglückliche Lösung ist.
Aufjedenfall soll es diesmal ewas schöner werden und habe mir dazu einige Tuts von oZone3d.net angesehen zum thema blinn-phong und
ambient occlusion unter Verwendung von Normalmaps und Bumpmaps. Erst wollte ich ne Radiosity schreiben, aber das ist mir für den Anfang zu heftig...
Das Verständnis für die verschiedenen Methoden ist definitiv vorhanden (besonders weil ich es ja schonmal pi*Daumen ohne Shader ausprobiert habe), allerdings
habe ich das Problem, dass ich keinerlei Ahnung habe, wie ich die Position der Kamera, die Position des Lichtes und den Blickvektor der Kamera erhalte und gerade auf diese drei Vektoren bauen ja alle Beleuchtungsmodelle auf. Da bringt es mir leider herzlich wenig, dass ich auf meinem Schreibtisch jetzt drei Beleuchtungsmodelle auf jeweils 2-3 Blattpapier in reinem Formeldeutsch aufgeschrieben habe, wenn die Herkunft der auf alles basierenden Vektoren fehlt.
Ich habe mal gelesen, dass man sich den Blickvektor in openGL aus einer der 2mio Matrizen auslesen kann... stellen sich die Fragen welche Matrix und wie auslesen?
Die Sache mit dem Lichtvektor ist wohl das kleinere übel, da ich halt nur "entweder so oder so" entscheiden muss.
@Lossy Ex: Ich weiß, habs umgeschrieben und Sinn verändert.. aber ich denke so isses besser.
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Diese Zeile habe ich mal eben aus nem Vertexshader von Lord Horazont geklaut. Ist das jetzt der Vektor, der in die Richtung zeigt wie meine Kamera?
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Also.
Um an die genannten Vektoren zu kommen, musst du dir erstmal ne Matrix mit den Kameraaktionen (Rotate, Translate) zurechtlegen.
( Ich habe das so gelöst, dass ich die aktuelle Matrix zwischenspeicher, dann die Identiätsmatrix lade, auf dieser meine operationen durchführe, sie speichere und dann wieder die ursprüngliche zurücklade ).
Dann kannst du dir den View-Vektor, der sich folgendermaßen in der Matrix befindet, da raus holen und den als Kamerasichtvektor verwenden:
Code:
4x4 Matrix:
r r r t
u u u t
v v v t
. . . .
r => rightvector, u => upvector, v => der für dich interessante viewvektor, t => verschiebung
Ich bin mir gerade nicht sicher, aber möglicherweise ist T dann die Kameraposition.
//Edit: Du dieb . Der ist alt, ich weiss nicht, ob das so richtig ist.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
( Ich habe das so gelöst, dass ich die aktuelle Matrix zwischenspeicher, dann die Identiätsmatrix lade, auf dieser meine operationen durchführe, sie speichere und dann wieder die ursprüngliche zurücklade ).
Ja ne ist richtig... Also ganz kurz, ich hatte es bisher noch nie nötig irgendwie eine Matrix mit gewalt zu manipulieren, oder auszulesen. Ich denke ich werd mir dazu mal das Matriezen tut zum x.mal durch lesen, in der Hoffnung erleuchtet zu werden.
Aber du kannst mir verraten, wie du die Matrix Daten in den Shader bekommst, oder greifst du dort direkt per varying/attribute drauf zu?
PS.: das dein anderer Thread alt war/ist beweist immerhin dass ich verdampt nochmal nach einer Lösung suche
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Aus dem alten Thread:
MatReno hat geschrieben:
Also für blinn / phong kann ich dir das GLSlang2 Tutorial von LaBoda empfehlen. Da ist auch ein Link zu Delphi3d, wo auch blinn und phong nochmals sehr genau mit Vektorzeichnungen beschrieben sind.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Den Eye-Vector berechnte ich noch auffer CPU und übergebe ihn dann erst an GLSL.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
sieht zwar toll aus vom Code her, wenn ich es starte sehe ich allerdings nichts. Es ist einfach alles schwarz. Das ProgrammObject schmeist allerdings auch keine Meldung heraus, also sind alle Variablen korrekt mit werten gefüllt, die auch recht vernünftig sind. Zum vergleich mal ausm Programm, wo ich de festlege:
MyCam führt beim Rendern die transformation und rotation unmittelbar vorm zeichnen von MyCube aus. das das funktionieren sollte hab ich schon gesehen, als ich im voriegen Thread von mir enfach mal Texturen vom Shader auf den Würfel legen lassen habe.
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Einige deiner Uniforms sind vom Typ vec4, aber du übergibst sie mit glUniform3fARB. Das kann ja nicht gut gehen PS: Das ARB kannst du dir inzwischen sparen, wenn du einen aktuellen Header hast.
son Bockmist... darf ich das als einen "Shader-Rookie-Exception-Error" zurückgeben?
Ich änder das gleich mal
[Edit1] so habs korrigiert.. läuft aber trotzdem nicht.. hab mir auch schon den Code zum tut von La boda angeschaut und finde den fehler einfach nicht.
[Edit2] also ich sehe wieder etwas^^... allerdings überzeugt mich das was ich sehe kein bischen... pro klick dreht sich die Box um etwa 5° um Y und wenn die Front in einen bestimmten Quadranten zeigt, dann ist sie weiß, ansonsten blendet sie sich in blau (die ambientefarbe). komisch.. ich werde noch etwas tüffteln.
[Edit3] Ich habe den shader jetzt um ne Diffusemap und ne 8bit Specularmap erweitert, die sind also in rgba einer *.tga gespeichert. Das sieht soweit ganz gut aus, allerdings scheint etwas mit den Vektoren noch nicht ganz rund zu laufen, denn wenn der Würfel sich gegen den Uhrzeiger sinn dreht (Y-Achse), dann wandert das Specular im Uhrzeigersinn (auch Y-Achse) um den Würfel, obwohl die Lichtquelle ihre Position bei behält. Das Specular bleibt also nicht konstant in Richtung des Lichtes auf der Oberfläche des Würfels, sondern dreht auch seine Runden, sobald der Würfel sich dreht. !?
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Also ich habe jetzt mal einen anderen Weg ausprobiert Phonglight zu erstellen (ozone3d.net), als La Boda. Das Problem is das selbe, allerdings habe ich jetzt festgestellt, dass es wohl mit den Normalen zusammen hängt und nicht mit dem Cameravector. Wenn ich nämlich die Normalen Zeichnen lasse ( gl_FragColor = vec4(gl_Normal.xyz / 2.0 + 0.5,1.0); ), dann ist alles in der Szene einfarbig egal, in welche Richtung es zeigt. Die Farbe ändert sich allerdings, wenn ich den Würfel rotieren lasse.
Wenn ich das andere Phonglight benutze, dann wirkt es so, als wenn die gesamte Szene Maskiert wäre und der Würfel ein Stück einer Kugel preisgeben würde, abhängig davon, wie man ihn dreht. Steht der Würfel in Ausgangsposition, dann sieht man die Licht zugewandte Fläche der Kugel (nur einen kleinen Ausschnitt), da sich dort das Specular befindet ist der ganze Würfel weiß.Dreht man den Würfel jetzt um 180°Y, dann sieht man einen Ausschnitt der Rückseite der Kugel, also die Ambienz. Bei etwa 45°Y hat man so ziemlich den Übergang von Specular ins Diffuse.
Die Normalen hole ich mir im Vertexshader her:
Code:
varying vec3 normal
normal = gl_NormalMatrix * gl_Normal;
Hat wer ne Ahnung, warum alle meine Normalen in EINE Richtung zeigen?
Muss ich im Programm evtl. noch etwas mit den Normalen anstellen?
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
rüschdüsch! Hab ich auch gemerkt, als ich den Source von La Boda nochmal durchkämmt habe. Da vielen mir dann zwischen den glMultiTexCoords und den glVertex3f son paar glNormal3f auf... ja dumm gelaufen, ich dachte GL legt sich die Normalen automatisch zurecht. Nu hab ich die natürlich auch in meine Zeichen routine eingebaut und ne funktion geschrieben um aus 3 Punkten, oder 2 Vektoren ein Kreuzprodukt zu bilden.
Also alles in allem ist der shader jetzt schon realistischer geworden. Noch nicht ganz korrekt, aber realistischer.
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Jetzt wo die Normalen stimmen und das Licht immer noch nicht so scheint wie es soll, hab ich mich weiter auf die Suche gemacht. Da hab ich einfach mal gl_Vertex.xyz als FragColor übergeben, damit ich die Weltkoordinaten auf den Würfel Projekziert sehe. Da ist mir aufgefallen... naja also eigentlich sollten die Raumkoordinaten ja an den Raum gebunden sein und nicht an den Würfel oder? Weil wenn der Würfel rotiert, dann drehen die sich mit. Kann man das abstellen durch ne multiplikation oder so? Hab schon ein paar sachen ausprobiert aber keine gescheiten Ergebnisse bekommen.
_________________ ist Ihnen schon mal aufgefallen, dass wenn Sie beim Wort Schlagersängerinnen die ersten 6 Buchstaben streichen, das 'e' durch ein 'f' ersetzen, die nächsten 7 Buchstaben rückwärts lesen und dann ebenfalls elemenieren und zusätzlich die beiden nebeneinanderstehenden n's durch ck ersetzen, das Wort 'ficken' ergibt?
Registriert: Mo Sep 02, 2002 15:41 Beiträge: 867 Wohnort: nahe Stuttgart
Meines Wissens muss man gl_FragColor auch einen Alphakanal übergeben.
Für dein Vorhaben hast Du 3 Möglichkeiten:
1. ftransform() zuweisen, das wie die fixe Funktionspipeline rechnen würde.
2. gl_Vertex * gl_ModelViewMatrix, denn deine Rotationen, Skalierungen und Translationen stecken in der ModelViewMatrix. Deine Methode würde funktionieren, wenn du wirklich die Würfelkoordinaten (X,Y,Z) rotieren würdest.
3. direkt gl_Position an gl_FragColor übergeben
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
gl_ModelViewMatrix * gl_Vertex. Andersrum spuckt dir OpenGL afaik nen fehler aus, oder du hast eine sehr tolerante Karte.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
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.