- gl_TexCoord[x] = gl_MultiTexCoordx;
DGL https://delphigl.com/forum/ |
|
Shadowmap und Shader https://delphigl.com/forum/viewtopic.php?f=20&t=8188 |
Seite 1 von 2 |
Autor: | Strecker [ Mo Feb 02, 2009 17:22 ] |
Betreff des Beitrags: | Shadowmap und Shader |
Hi ich bin noch blutiger Anfänger in Sachen Shader. Hab gestern angefangen und auch schon ein bissl was hinbekomm. Jetz wollte ich Shader in mein aktuelles Progrekt einbinden und dabei ist folgendes Problem aufgetreten: In meinem Projekt verwende ich Shadowmapping für den Schatten. Wenn ich jetzt allerdings per Multitexturing im Shader wieder meine Texturen und die Schattentextur ausgeben will, wird die Schattentextur nicht über die ganze Szene gerendert sondern auf jede einzelne Primitive, wie ne normale textur eben. Muss ich die Änderung in der Texturmatrix an den Shader übergeben? und wenn ja wie? mfg Strecker |
Autor: | Lord Horazont [ Mo Feb 02, 2009 21:09 ] |
Betreff des Beitrags: | |
Deine Texturkoordinaten liest du (im Vertex Shader) sicherlich mit: Code:
aus. Dem musst du jetzt nurnoch sagen, dass er auch mit der Matrix multiplizieren soll: Code:
Und das sollte dein Problem auch schon lösen ![]() (x natürlich mit dem Index der entsprechenden Texturunit ersetzen - ich empfehle, das übrigens nur auf die Texturunit anzuwenden, wo du es brauchst.) Gruß Lord Horazont |
Autor: | Strecker [ Mo Feb 02, 2009 22:23 ] |
Betreff des Beitrags: | |
ok danke erstmal. ich hab es mal so ausprobiert. jetzt sieht es zwar anders aus aber iwie immer noch falsch. könnte das mit der autom. texturkoordinatengenerierung (gl_TexGen) zusammenhängen? wie könnte man dieses problem lösen, dass quasi auch im shader die texturkoordinaten korrekt generiert werden? |
Autor: | Schläfer [ Mi Feb 04, 2009 17:43 ] |
Betreff des Beitrags: | |
Also wenn die Shadowmap zB die Silhouette eines Baums darstellt würde ich für jeden Pixel im Fragmentshader über eine Projektion den entsprechenden Punkt auf der Map ausrechen. Das geht wohl mit "texture2DProj". Kannst mal bei http://wiki.delphigl.com/index.php/Tutorial_Wassereffekt schauen, ob du das was verwenden kannst. So richtig blick' ich das allerdings auch nicht wie das funktioniert, mit dem Matrizen und so. Die andere Möglichkeit, die für mich intuitiver ist, wäre das per Hand auszurechnen: Also die Vertexposition mit der Modelviewmatrix aus dem Vertexshader an den Fragmentshader weiterreichen. Die Richtung der Lichtquelle, wenn es die Sonne ist, als uniform-Variable übergeben, ansonsten die Position. Und mit der Matrix deiner Kamera multiplizieren (Richtungsvektoren natürlich nur drehen und nicht verschieben). Wenn man sich dann den Baum als Fläche im Raum vorstellt, kann man aus der Gerade von der Vertexposition in Richtung Lichtquelle und der Baum-Ebene den Schnittpunkt mit der Ebene errechnen. Dann kann man aus dem Ursprung der Baum-Ebene und den beiden Richtungsvektoren, die die Ebene aufspannen, die Koeffizienten für die Vektoren bestimmen damit der Schnittpunkt rauskommt. Und die Koeffizienten wären dann die Koordinaten für die Textur. Ist bestimmt nicht die schnellste Variante, aber wie gesagt, das andere Versteh ich auch nicht so wirklich, und wenn hier sonst keiner mehr antwortet, hilft es dir vllt wenigstens ein bischen. |
Autor: | Strecker [ Do Feb 05, 2009 17:53 ] |
Betreff des Beitrags: | |
hmmm.. aba soweit ich weis ist die Textur ja schon durch den Fragmentvergleich "gelaufen" und ist schon an den richtigen Stellen hell bzw. dunkel und muss jetzt nurnoch mit der richtigen skalierung und position etc. über die Szene gelegt werden. Das hat vorher (ohne Shader) glTexGen übernommen (und die Änderung der Texturenmatrix) ... wenn ich jetz die Textur an den Shader übergebe, wird alles was in glTexGen gemacht wird, nicht übermittelt. Also hab ich versucht das im Shader nachzubauen aber es kommt immer nur Müll raus. Weis jemand wie ich das im Shader nachbauen kann: Code:
Vielleicht kennt ja auch jemand eine bessere Methode Schatten zu erzeugen .. vielleicht eine die nur über den Shader funktioniert?[/pascal] |
Autor: | Schläfer [ Do Feb 05, 2009 18:51 ] |
Betreff des Beitrags: | |
Also eigentlich müssten die Texturkoordinaten ja egal ob Shader oder nicht gleich sein, weil das denke ich nur ein automatisierter Aufruf von glTexCoord ist. Das heißt, das was Lord Horazont vorgeschlagen hat, würde schon reichen. Vielleicht kannst du mal noch dem Shader (Vertex und Fragment) posten. Wenn man mit dem Shader einfach die Fixed Functionpipeline nachbauen würde, dürfte es keinen Unterschied machen, ob der Shader an oder aus ist. Also kann es gut sein, dass der Fehler im Shader liegt. |
Autor: | Strecker [ Do Feb 05, 2009 20:29 ] |
Betreff des Beitrags: | |
okay .. also hier sind die shader (aufs nötigste minimiert) Texture1 ist die Schattentextur. Vertex Shader: Code:
Fragment Shader: Code:
Im Programm passiert folgendes: Code:
Ohne Shader wird die Shadowmap wunderbar ausgegeben .. mit Shader kommt nur Müll .. wäre überdankbar^^ wenn jemand mir sagen könnte was ich falsch mache mfg |
Autor: | Philip [ Do Feb 05, 2009 20:50 ] |
Betreff des Beitrags: | |
Ich hab noch nie Shader wirklich angefasst, aber müsste Code:
nicht Code:
heißen? |
Autor: | Strecker [ Do Feb 05, 2009 21:05 ] |
Betreff des Beitrags: | |
naja das ist ja in diesem fall egal weil die Texturenmatrix der ersten Textureneinheit nicht verändert wird .. mir gehts ja um die Schattentextur und deren Matrix und alles |
Autor: | Schläfer [ Do Feb 05, 2009 21:57 ] |
Betreff des Beitrags: | |
Vertausch mal "gl_MultiTexCoord1" und "gl_TextureMatrix[1]" im Vertexshader. Matrizenmultiplikationen sind nicht kommutativ. |
Autor: | Strecker [ Sa Feb 07, 2009 13:30 ] |
Betreff des Beitrags: | |
wenn ichs vertausche kommt garnichts mehr .. also als wäre dir schattentextur komplett weis |
Autor: | Schläfer [ Sa Feb 07, 2009 18:14 ] |
Betreff des Beitrags: | |
Hm, das ist allerdings nicht so gut. Ich denke aber so wäre es richtig, die Vertexposition wird ja auch mit der Matrix an erster Stelle multpliziert. Kannst ja mal die Texturkoordinaten überprüfen und mit den Sollwerten vergleichen. Richtig gut geht das natürlich nicht, aber wenn man mit "gl_FragColor = gl_TexCoord[1]" die Farbe verändert kann man vllt schon etwas erkennen. Es kann aber auch sein das "texture2D" bei deinen Texturkoordinaten nicht funktioniert, weil sie vielleicht 3-dimensional sind. Also nicht nur X und Y-Wert bestimmend sind sondern auch Z. Keine Ahnung was bei der automatischen Generierung wirklich erzeugt wird. In dem Fall müsste man dann wohl "texture2DProj" verwenden, aber wie oben schon gesagt, kann ich die Funktionsweise auch nicht so richtig nachvollziehen, also ist das mehr geraten. |
Autor: | Strecker [ Sa Feb 07, 2009 19:32 ] |
Betreff des Beitrags: | |
okay danke erstmal .. ich bin meiner Problemlösung schon ein stückchen näher gekommen .. und zwar muss der Z-Vergleich im Shader gemacht werden (und evtl. die Texturkoordinatengenerierung auch) .. nur habe ich wiedermal keine Ahung wie .. vielleicht hat sie jmd anderes? mfg |
Autor: | Sascha Willems [ Sa Feb 07, 2009 19:55 ] |
Betreff des Beitrags: | |
Dafür gibt es in GLSL doch spezielle Sampler : Code:
Die nehmen dir quasi die ganze Arbeit der Projektion und des Tiefenvergleichs ab, du musst sowas also nicht komplett im Shader nachbauen. |
Autor: | Strecker [ Sa Feb 07, 2009 20:12 ] |
Betreff des Beitrags: | |
okay .. ich denke ich habe jetzt genug anhaltspunkte um das selber hinzubekommen .. solbald ichs habe (oder wenn ich am verzweifeln bin^^) schreib ich nochmal mfg |
Seite 1 von 2 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |