Ich arbeite an einem 3D-Spiel in C ++ und OpenGL 3.2 mit SFML. Ich habe mich angestrengt, Point-Light-Shadow-Mapping zu implementieren. Was ich bis jetzt gemacht habe, scheint mir zu entsprechen, was ich gelernt habe und Beispiele, die ich gesehen habe, aber immer noch keine Schatten.
Was ich getan habe, ist eine vereinfachte Liste des gesamten Codes, den ich benutze, in der genauen Reihenfolge, in der ich ihn verwende, aber nicht als vollständigen Quellcode, sondern nur als relevant (weil mein Projekt in mehrere Klassen aufgeteilt ist):
%Vor%Hier ist ein Bild von dem, was mein Code jetzt macht:
Das ist ein seltsamer Effekt, scheint aber nahe zu sein, was ich meinte. Es scheint, dass jede Oberfläche, die dem Licht bei 0, 0, 0 ausgesetzt ist, in der Mitte einen unbeschatteten Kreis hat, während alles andere unschattiert ist.
Eine sehr nützliche Methode, um Schattenkarten zu debuggen, ist in der Tat eine Möglichkeit, den Inhalt der Schattenkarten als Quads auf dem Bildschirm anzuzeigen. 6 Quads bei Würfel-Shadow-Maps. das könnte als Debug-Osterei implementiert werden, wo Sie die gesamte Textur auf dem ganzen Bildschirm anzeigen und zum nächsten Gesicht wechseln können, so dass Sie die 6 Gesichter mit einer anderen Tastenkombination rutschen können.
Dann ist eines der wichtigsten Dinge in kubischen Schattenkarten der Tiefenbereich. Ein Punktlicht hat keinen unendlichen Bereich. Daher möchten Sie den Tiefenspeicher in der Regel so skalieren, dass er dem Lichtbereich entspricht.
Sie können Fließkomma-16-Bit-Luminanz- (oder Rot-Kanal-) Textur verwenden, um eine Welttiefe zu speichern (sphärisch, dh die wahre Länge (Strahl zu Schnittpunkt) mit einer kleinen Berechnung im Pixelshader) Oder Sie können lineare Tiefe verwenden (die gleiche Art, die in einem klassischen ZBuffer gespeichert wird, das ist die Tiefe der normalisierten Gerätekoordinaten. Das ist die Tiefe nach der Projektionsmatrix. In diesem Fall, um die Weltposition einmal in der Beleuchtung zu rekonstruieren Shader (nächster Durchlauf), das Problem ist sicher zu teilen durch w, nachdem Sie mit der Kamera-Cube-Face inverse Ansicht * Projektion multipliziert.
Der Schlüssel zum Debuggen von Shadow Maps liegt im Shader-Twiddling. Beginnen Sie mit Farben, um die in Ihren Schattenkarten gespeicherte Tiefe zu visualisieren, die von den Pixeln Ihrer Welt wahrgenommen wird. Es war der einzige Weg, der geholfen hat, Punkt-Shadow-Maps in der Engine meiner Firma zu reparieren. Sie können einen Farbcode mit einer Kombination aus mischen und klammern wie blau von 0 bis 0,3, rot von 0,3 bis 0,6, grün von 0,6 bis 1 machen. Wenn Sie Welt Distanz Speicher haben, ist es einfacher, aber es ist immer noch interessant, es durch Farbcodes. benutze einfach die gleiche Funktion, aber dividiere die Distanz durch deinen erwarteten Weltbereich.
Mit diesem Vizu-Schema können Sie die schattierte Zone sofort sehen, da sie alle dieselbe Farbe haben (da der 'Strahl' von einer näheren Oberfläche abgefangen wurde). Sobald du an diesen Punkt kommst; der Rest wird alles reibungslos ablaufen.
viel Glück:)
Tags und Links c++ opengl shadow-mapping