Ich möchte in meinem kleinen Progrämmchen ein Bumpmapping verwenden. Mein Cubemapping auf eine Kugel mit Hilfe von LossyX glBitmap funktioniert einwandfrei. Und jetzt kommt mein Problem. Laut Tutorial kann ich mit der glBitmap auch eine Normalmap erstellen. Dies habe ich auch mal getan und diese auf die selbe Weise eingebunden, wie zuvor meine CubeMap. Funktioniert soweit wunderbar. Ich sehe eine Normal Map auf meiner Kugel. Um diese für meine eigentlichen Texturen (6 an der Zahl) zu berechnen muss man ja, soweit ich das gelesen habe bestimmte Tools verwenden, oder selber schreiben. Da kommt schon meine ersten Fragen:
1. Wie erstelle ich eine Normalmap aus meinen Texturen (Ich habe nicht ganz verstanden wie diese normalisierten Vektoren aus meinem vorherigen Bild zu erhalten sind) 2. Wie binde ich diese Texturen (Normalmap und Cubemap) ein um Sie später im Shader verwenden zu können,
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
1. entweder du machst das mit der glBitmap wie du das ja schon bei der anderen gemacht hast (kannst sie ja auch wieder als datei speichern wenn du willst), oder du besorgst dir die passenden Plugins für die Bildbearbeitungsproggs. Oder willst du es wirklich selbst berechnen?
2. dazu bindest du einfach die 2 Texturen und sagst dem Shader über ein uniform welche erbenutzen soll: im Progg:
Code:
glActiveTexture(GL_TEXTURE0); Tex.Bind;
glActiveTexture(GL_TEXTURE1); NormalMap.Bind;
im Shader:
Code:
uniformsampler2D Texture0;
uniformsampler2D Texture1;
Ich hab ma noch meinen BumpMapShader mit ran gehangen, der arbeitet bis auf ein kleinen Schönheitsfehler ganz gut...
MfG Bergmann.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
danke fuer die schnelle Antwort. Werde das gleich mal ausprobieren. Ja ich wollte es wirklich selbst rechnen, da die Texturen im Programm dynamisch erstellt werden.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
dann sollte dsa doch totzdem mit der glBitmap gehen... Und nochwas zum Shader. wenn man das Licht bezüglich zum Objekt dreht funzt. Aber wenn man das Objekt bezüglich zum Licht drehet, dann verschiebt sich der Schatten bzw. die Lichtquelle um 45°. Wenn du ne Lsg für das Problem hast sag me bescheid, würd mich freun...
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
vielleicht liegt der Fehler an dieser Zeile:
Code:
vec3 normal = (normalize(vec3(texture2D(Texture1, TexCoord)) + vec3(-0.5, -0.5, -0.5)));
du rechnest da (-0.5,-0.5,-0.5) auf den nicht normalisierten Vektor und normalisierst erst hinterher. Probier es doch einmal aus, ob der Shader ohne die (mmn merkwürdigen) Rotationen auskommt, wenn du die Zeile so schreibst:
Code:
vec3 normal = normalize(vec3(texture2D(Texture1, TexCoord))) + vec3(-0.5, -0.5, -0.5);
Also ich hab die Texturen jetzt mal gebunden. die sind jetzt beide übereinandergelagert auf der Kugel. Ist der Shader aus sehe ich dies auch eindeutig. Sobald ich den Shader einschalte ist die Kugel schwarz. Das Licht ist enabled, die Position des Lichtes angegeben. Beide Codefragmente sehen so aus:
Code:
procedure Render;
var gObj : PGLUQuadric;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
@heavenssake007: Hast dus schonma ihne Shader, und nur mit licht probiert? Und wo bzw. wie aktivierst du den Shader? Was mir aber aufgafallen ist (aber nichts mit dem eigentlichen Problem zu tun hat) ist, das du in jedem Renderdurchgang ein neues Quadric erstellst (gluNewQuadric). Wenn du mal den Speicherverbrauch deines Programms im Auge behälst sollte das immer mehr werden und irgendwann is dann voll...
@Sellmann: Das -0.5 muss mit normalisiert werden (habs probiert). Das legt daran, die Farbwerte nur positiv sind, aber die Position des Lichts auch negativ sein kann. Die Werte liegen zwischen (0,0,0) und (1,1,1). Nach der Subtraktio zwischen (-0.5, -0.5, -0.5) und (0.5, 0.5, 0.5). Jetz sollter der Vektor bereits die richtige Richtung haben, kann aber noch länger oder kürzer als 1 sein. Also muss ich noch normalisieren. Hab grad festgestellt, das es an der Rotation liegt. Die Funktion arbeitet nicht richtig bzw. überhaupt nicht. Hat jmd ne ordentliche Funktion zur Rotation eines Punktes/Vektors um eine beliebige Achse?
€: Hab grad noch bisl dran rum gebastelt. Jetzt is schonma die Verschiebung um 45° weg. Das einzige was ich nich hin bekomm is, dass das Licht nicht wandert, wenn ich die Kamera drehe. Normalerweiße sollte ja das Licht gleich bleiben, und nur der Glanz zuzusagen in die entgegengesetzte Richtung laufen. Ich hab ma ne Demo gemacht, da kann man den Unterschied zwischen PerPixelLight- und BumpmapShader gut erkennen. (RMT = Licht drehen, LMT = Kamera drehen) Sry für die Parts, aber der VPN-Server von unserer FH is schon wieder down, un da komm ich net auf mien WebSpace -.-
€2: ICH HABS, FREU!!!! So hab ichs gemacht:
Code:
vec3 normal *=gl_NormalMatrix;//aus dem
vec3 normal =gl_NormalMatrix* normal;//wurde das
anscheint hat da die 1.0 gefehlt, weil N ja nur vec3 is oder so kp. Aber jetzt funzt er 1a. Würd mich freun wenn wir den auch in die ShaderSammlung übernehmen können (da hab ich mich dann auch im wiki verewigt ) Hab ma die Anhänge von oben durch die aktuellen ersetzt... @heavenssake007: Ich hab noch ne (Teil-)Antwort auf deine Frage zwecks Texturen selbst machen. Wenn du den Vektor bzw. die Normale dann aus dem Bild errechnet Hast kannst du die so in ne Farbe umwandeln: (Vector+1)/2 vorrausgesetzt, das der Wertebereich der Werte im Vektor zwischen -1 und 1 liegt...
MfG Bergmann
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Stimmt, das mit der Normalisierung leuchtet ein. Das mit dem glNormalMatrix * Normal aber auch . Ich hatte hier irgendwo auch einen Bumpmapping-Shader gepostet, da fehlte aber noch die Berechnung für Tangente und Bitangente, worraufhin dann von Coolcat der Ansatz mit dem Gradienten der Textur vorgeschlagen wurde. Warum mein Shader auch ohne Tangente und Bitangente funktionierte lag wohl daran, dass ich nur Würfel damit beleuchtet hab, deren Normalen immer genau senkrecht auf der beleuchteten Ebene standen.
Also ab damit in die Shader-Sammlung (wobei man evtl. noch das AttenuationModel aus dem Phong-Shader mit einarbeiten könnte, damit das Licht nicht unendlich weit leuchtet).
@Bergmann Der Shader wird bei mir in einer Start Shader Procedure ausgeführt. Der Shader Startet bei einem ButtonClick. Ich hab mich dabei an den Aufruf aus dem Tutorial gehalten. Für einen Blur Shader hatte das schonmal funktioniert.
sage mal ist es zu dreist zu fragen, ob Du mir die Unit glShader geben könntest. Ich weiss nicht so wirklich, was ich beim einbinden falsch mache. Mir ist klar, dass, wenn ich meinen Shader nur auf ein Objekt anwenden möchte den Shader einbinden, bzw. wieder entbinden muss. Habe ich jedoch nur ein Objekt (Kugel in meinem Fall) im Bild kann dieser doch auch die ganze Zeit anbleiben, oder?
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Wie groß ist dein Projekt den i9nsgesamt? Kannst du es evtl. mal packen und hier anhängen? Dann würde ich mir das mal anschauen und gucken ob ich den Fehler finde. Natürlich sag ich dir dann bescheid, wenn ich da was entdeckt habe.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
@Sellmann: meintest du den Thread? ^^ Sascha hat mich vorhin freigeschalten, da mach ich mich dann ma daran den Artikel zu schreiben. Das mit den Phong Shader guck ich mir nochma an, aber so schwer klingt das nich...
@heavenssake007: Fragen kostet nix ^^ die Unit is im Anhang. Hab ma noch schnell paar Kommentare rein geschrieben. Wenn der Shader auf alle Objekte angewendet werden soll kann man den an lassen, ja. Versuchs ma mit der Unit, wenns dann nich geht suchmer wo anders. Wenns geht vergleich den Code mal, wo der Fehler is.
MfG Bergmann
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ich habe das Projekt mal gepackt und zuvor noch ein wenig kommentiert. Bei der 2d-Textur mit Shader läuft alles wunderbar. Nehme ich die Cubemap und schalte den Shader an, ist alles schwarz. Vielleicht habt Ihr ja eine Idee, woran das liegen mag. Ich danke Euch schon einmal sehr für Eure Hilfe!!!
Heavenssake007
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
du hast zwar eine NormalMap erstellt, aber die is leer. Die Methode GenerateNormalMap() erzeugt aus der aktuell geladen Textur eine NormalMap. Da aber keine geladen wurde ist alles schwarz. Und eine schwarze NormalMap reflektiert kein Licht Du must also zu deiner CubeMap eine CubeNormalMap erstellen. Da die glBitmap diese Fkt nicht mitliefert musst du dir die Texturen selbst generieren, und dann als CubeMap laden und Binden, dann sollte das gehen...
€: Hab das grad ma ausprobiert, daran liegts auch nich. Ich denk ma der Shader kommt mit der CubeMap nich klar. Da musst du dir wohl die Mühe machen un die Sachen die OpenGL normalerweiße allein macht selber im Shader realisieren. Der Artikel über CubeMaps im Wiki sollte dir dabei helfen.
Hab auch ma mein TestProjekt angehängt. Wenn du jetzt den Shader noch anpasst, dann sollte es so funktionieren. Mal nebenbei, wozu brauchst du das? CubeMaps nimmt man doch normalerweße für Spielgelung an Objekten, oder? Und die zu Bumpmappen wäre ja sinnlos, weil das reflektierende Objekt ja dann die Stuktur annimmt?!
MfG Bergmann.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Danke für die Hilfe, bin jetzt durch Deine/Eure Hilfe schon entscheidend weitergekommen. Sollte mir die Shaderanpassung für die Cubemaps gelingen, so stelle ich diese hier rein.
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
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.