Nein. Gut ich will nicht behaupten mich mit Delphi auszukennen, aber in der ersten Variante erzeugst du einen String und gibst einen Pointer drauf an glGetUniformLocation. Der String wird aber nur temporär erzeugt wird und nicht in einer Variable gespeichert. D.h. es wird einfach nur
Code:
PAnsiChar('LampColor'+inttostr(i)))
ausgewertet und der String wieder freigegeben/zerstört. Erst dann wird glGetUniformLocation aufgerufen, mit einem Pointer auf einen mittlerweile ungültigen String.
In der zweiten Variante bleibt der String bis zum Ende deiner Methode gültig.
Ist doch aber eigentlich das gleiche oder? Habe Delphi 2010...
Nein. IntToStr gibt in Delphi2009/10 einen WideString zurück. Da aber bei einer Redeklaration zu PAnsiChar keine Konvertierung durchgeführt wird, wird der Name falsch übergeben.
Der zweite Fall funktioniert, da bei der Zuweisung des String auf "idx" eine Konvertierung auf AnsiString durchgeführt wird.
sooo meine Texturprojektion haut ja jetzt hin. Das Problem ist lediglich das nicht nur auf die Vorderseite eines Objektes projeziert wird, sondern auf auf der Rückseite, was ja physikalisch unmöglich ist.. Weiß jemand wie ich das Prolbem lösen kann?
Nun wenn du weißt wo der Lichtquelle ist und wo das gerade gerenderte Fragment ist und du zudem die Normale kennst, kannst du doch leicht feststellen ob die Normale zur Lichtquelle zeigt oder nicht und entsprechend reagieren.
Letztlich wirst du aber eine echte Schattenberechnung wollen, da wären dann ShadowMap bzw. StencilShadow die Schlagworte
je nach dem wie deine Normalen sind. Diesen Wert musst du aber sowieso für die Beleuchtung ausrechnen, oder nicht? Ist ein stink normaler Per-Pixel-Light-Shader....mit dem Unterschied das du mehrere Lichtquellen hast.
Es ist zu empfehlen posEye an den Fragmentshader zu geben und erst im Fragmentshader meineLampe[0].position.xyz - posEye.xyz zu berechnen.
uniform vec4 LampColors[max_lights]; //Lichtfarbe und intensität uniform int GoboIndex[max_lights]; //gibt an welcher Gobo Sampler projeziert werden soll uniform vec4 AmbientColor; //Umgebungsfarbe uniform vec4 LightPos[max_lights]; //Lampenpositionen für evtl. weitere Berechnungen
vec3 N = normalize(normal); vec3 L; vec3 lightDir; //Projektion für jede Lampe for (int i=0; i <= max_lights; ++i) if (GoboIndex[i]>=0) { lightDir = vec3(LightPos[i].xyz - posEye.xyz); L = normalize(lightDir); if (dot(N,L)>=0) if(projCoord[i].q<0.0) {
Für die Normale ist das nicht nötig, die kannst du auch im Vertexshader transformieren. Vom Prinzip geht das aber auch im Fragmentshader wenn du unbedingt willst.
im Vertexshader bleiben. Ich hab da gestern Unsinn erzählt, dachte irgendwie das würde Probleme mit der Interpolation geben wenn das Polygon die Lichtquelle schneidet. Aber es ist natürlich das gleiche:
Die Probleme wenn das Polygon die Lichtquelle schneidet gibt es sowieso, weil dann lightDir 0 wird und du nicht mehr Normalisieren kannst. Sorry, war einfach zu spät gestern
Übrigens ist der Variablename posEye total irreführend.
halt, warte ich glaub ich verwechsele das jetzt mit weiteren objekten hinter der projektion... Ich glaube da hilft mir wirklich nur eine Schattenberechnung... könnt ich die denn einfach in meinen aktuellen Shader integriere?
Ich weiß ich brauch irgendwie die Tiefeninformationen.. Ich will jedoch ungern für jeden Projektor meine Szene nochmal rendern.. Aktuell Render ich für 7 Lichtquellen 1x die Szene..
Ich weiß ich brauch irgendwie die Tiefeninformationen.. Ich will jedoch ungern für jeden Projektor meine Szene nochmal rendern..
Du hast die Wahl zwischen ShadowMaps und StencilVolumen. Bei ShadowMaps musst du die Szene aus der Perspektive jeder Lichtquelle rendern und du benutzt dann quasi den Z-Buffer als ShadowMap wenn du die eigentliche Szene renderst.
StencilVolumen funktioniert anders. Dort baust du das Volumen des Schattens als Geometrie nach und führst dann mit Hilfe des Stencil-Buffers einen Inside-Test (*) für diese Volumen aus. Das geht natürlich extrem auf die Füllrate, weil das Volumen eine große Fläche hat. Zudem ändert sich die Geometrie des Volumens immer wenn sich irgendwas bewegt.
(*) Ausgehend vom aktuellen Pixel schießt du einen Strahl in eine beliebige Richtung und zählst die Ein- und Austritte aus dem Volumen. Wenn die Anzahl ungerade ist bist zu im Volumen. Sowas geht mit dem Stencil-Buffer ziemlich gut.
Mitglieder in diesem Forum: 0 Mitglieder und 19 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.