OpenGL-Tex-Generation wo in Pipeline?

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

OpenGL-Tex-Generation wo in Pipeline?

Beitrag von Eisflamme »

Edit: Klappt jetzt alles.

Hi,

ich lagere gerade Terrain-Multitexturing und Schatten in einen Fragment/Pixel-Shader aus, da mir das, was OpenGL von Haus anbietet, nicht mehr reicht.

Jedoch scheint auch die Eye-Coordinates-Generierung nicht mehr zu funktionieren. Diese hat vorher für meine Schattentextur brav aus Kamera-Sicht die Texturkoordinaten des Schattens für jedes Objekt berechnet. Jetzt kommt da nichts mehr. :(

Ich bin nicht sicher, ob ich irgendwas falsch gemacht habe (da ich auch die Schattentextur selbst irgendwie nicht mehr einblenden kann) oder ob ich mit Vertex- + Fragmentshader automatisch die Koordinatengenerierung zerstört habe.

Weiß das jemand zufällig?
Zuletzt geändert von Eisflamme am 24.04.2012, 23:10, insgesamt 1-mal geändert.
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: OpenGL-Tex-Generation wo in Pipeline?

Beitrag von Eisflamme »

Ok, eigentlich sollte das quasi den Teil ablösen. Denn in meinem VertexShader könnte ich genau diese Texturkoordinaten-Erzeugung selbst basteln. Ein Blick in die Doku hat verraten, dass das auch gar nicht Mal so schwierig ist, wenn man die Texturmatrix sowieso schon hat, da die glTexGen-Funktionen sich einer ziemlich einfachen Formel bedienen.

Muss jetzt nur Mal schauen, ob ich diese drei Zeilen auch in einen Shader kriege, aber eigentlich ist das ja nur Texturwert-Vergleich mit z-Wert, oder? Oder entspricht ein z-Wert nicht demjenigen, der im Depth-Buffer ist?
//Enable shadow comparison
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE);

//Shadow comparison should be true (ie not in shadow) if r<=texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);

//Shadow comparison should generate an INTENSITY result
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY);

// Set alpha test to discard false comparisons
glAlphaFunc(GL_GEQUAL, 0.99f);
glEnable(GL_ALPHA_TEST);
Und dieses Beispiel hilft mir doch, zumal es mit Beseitigung des kleinen Bugs im Fragment-Shader auch läuft :): http://fabiensanglard.net/shadowmapping/index.php

Ich tüftel noch etwas, vielleicht sieht ja trotzdem jemand Denk- oder Logikfehler oder hat Tipps und will mich draufstoßen, danke jedenfalls!

Edit:
Und nun klappt's sogar, jay! Jetzt muss ich noch für weitere Distanzen die Shadowmap irgendwie verbessern, dann entpixeln und noch so ein paar Grafikfehler wegkriegen... dann hab ich was geschafft. Und durch das Auslagern in die Shader brauche ich auch nur noch zwei Passes :)

Und Shader sind sooo viel einfacher als die zig komischen OpenGL-Befehle...
Antworten