Ich teste die Grenzen der Doom 3-Engine - in Bezug auf die maximale Kartengröße.
Ich bemerkte einige Schablonenschatten-Präzisionsfehler, die stärker werden, wenn Objekte immer weiter vom Kartenursprung entfernt werden.
an Position: -10901 -18214 -11204
an Position: -10802 -26483 -19383
an Position: -10802 -34683 -27540
Ich glaube, diese Fehler wurden als "Schattenrisse" bezeichnet, aber ich bin mir nicht sicher, wie diese Artefakte zuvor genannt wurden.
Fast alle Artefakte erscheinen entlang der Grenzen der Lichter / Schatten - was hier zu sehen ist:
Hat jemand diese Art von grafischem Artefakt schon einmal mit Schablonenschatten gesehen? Wie werden sie genannt? Was ist die Ursache?
Mehr Beispiele:
Dies ist die Vanilla Doom 3 Engine, wie sie hier zu finden ist: https://github.com/TTimo/doom3.gpl
Beim Testen der cvar r_useOptimizedShadows (die die Schattenvolumina der Worldspawn-Geometrie verarbeitet) ist mir aufgefallen, dass das Artefakt verschwunden ist. Dann habe ich mich zu dieser Funktion durchgearbeitet:
R_LinkLightSurf( &vLight->globalShadows, tri, NULL, light, NULL, vLight->scissorRect, true /* FIXME? */ );
was ich geändert habe:
R_LinkLightSurf( &vLight->globalShadows, tri, NULL, light, NULL, vLight->scissorRect, false /* FIXME? */ );
Dadurch werden die Artefakte beseitigt - aber jetzt wird davon ausgegangen, dass wir uns niemals in Schattenvolumina der Worldspawn-Geometrie befinden. Wenn wir also in ein Schattenvolumen gehen, wird dieses Schattenvolumen nicht richtig gerendert.
float
) erwarten können . Sie haben leicht 5 davon verbraucht. en.wikipedia.org/wiki/…Antworten:
Ich habe endlich eine Lösung gefunden - eigentlich ein paar verschiedene Lösungen. Ich habe nicht herauszufinden , die eigentliche Ursache des Artefakts aus einer Grafik Perspektive Programmierung - aber ich habe einige Lösungen zu finden.
Wie ich bereits in meiner Frage festgestellt habe, schien das Artefakt nur auf den vorberechneten Schattenvolumina der statischen Geometrie der Weltbrut aufzutreten (bei der es sich im Grunde um eine Geometrie handelt, von der die Engine weiß, dass sie sich niemals bewegen wird, sodass sie vorab berechnet wird -Zeit die Schattenvolumes und andere Dinge mit einem in der Konsole eingegebenen Befehl namens "dmap"). Ich habe nicht herausgefunden, warum es nur auf den Schatten der statischen Worldspawn-Geometrie und nicht auf einem der ASE- oder LWO-Modelle lag.
Nun ist mir aufgefallen, dass es tatsächlich eine Vielzahl von Parametern gibt, die mit dem Befehl dmap verwendet werden können - einer dieser Parameter heißt "shadowOpt" - und der für die Schattenoptimierungsstufe stehen muss. Dieser Parameter legt eine Aufzählung fest - es scheint einige verschiedene Schattenoptimierungsstufen zu geben:
Ich hatte Erfolg mit Option 2 - "SO_CULL_OCCLUDED". Es behebt alle Artefakte - die Ausführung dauert etwas länger - aber ich glaube, ein Großteil dieser Zeit wird für das Drucken großer Informationsmengen auf die Konsole aufgewendet - diese Ausdrucke könnten wahrscheinlich reduziert oder beseitigt werden.
Einer der Orte, die mir einige Hinweise gaben, war der Kommentar hier in tr_stencilshadow.cpp:
Das Problem, nur diese "zusätzliche" Schattenoptimierung während "dmap" durchzuführen, besteht darin, dass, wenn eines dieser Lichter jemals bewegt wird (was je nach Art des von Ihnen ausgeführten Projekts immer möglich ist), standardmäßig die Option "Zurück" verwendet wird "nicht optimierter" Echtzeit-Prozess zur Erstellung des Schattenvolumens (für das bewegte Licht) und die Artefakte werden für dieses Licht wieder angezeigt. Die einzige Möglichkeit, um sicherzustellen, dass diese Artefakte nicht angezeigt werden, besteht darin, immer den sehr teuren Optimierungsprozess für diese statischen Worldspawn-Schatten auszuführen. Es ist in der Tat sehr teuer, daher wäre dies ein absoluter letzter Ausweg, wenn Sie keine richtige Grafiklösung finden könnten. (Wenn Sie dies tun, stellen Sie sicher, dass Sie Ihre Lösung hier veröffentlichen.)
Ich würde jedem empfehlen, der große Karten für die Vanilla Doom 3-Engine erstellt - und dabei Worldspawn-Geometrie verwendet -, eine Cvar zu erstellen, die er je nach seinen Anforderungen für die Echtzeiterstellung der optimierten Schattenvolumina ändern kann. Ich habe meine cvar r_useExpensiveShadowOptimizations aufgerufen - was ein Oxymoron zu sein scheint. Zum Beispiel:
Ich empfehle außerdem, dass Sie abhängig von der Größe Ihrer Karten (und der Annahme, dass sich die Lichter nicht bewegen) die Optimierungsstufe für das statische Schattenvolumen mit dem Parameter "shadowOpt" für dmap erhöhen.
Grundsätzlich sind alle Dinge, die Sie benötigen, um eine große Karte und keine Schattenartefakte zu haben, für Sie da. Sie müssen nur entscheiden, welche Sie verwenden müssen. Dies in Echtzeit zu tun ist extrem teuer und sollte nur als letztes Mittel durchgeführt werden, wenn Sie keine geeignete Grafiklösung finden. Dies in DMAP zu tun, ist absolut sinnvoll, da es das Problem löst und das Kompilieren der Karte nur noch wenige Sekunden dauert.
quelle
Es könnte sehr gut ein Präzisionsfehler mit schwebendem Zeiger sein, da Doom
float
s für das Rendern verwendet hat (hauptsächlich eine OpenGL-Einschränkung). Beim Herumspielentr_stencilshadow.cpp
habe ich jedoch diesen Kommentar bemerkt, der möglicherweise mit dem Problem zusammenhängt (InnenfunktionPointsOrdered()
):Da ist es also. Es könnte auch eine bekannte Einschränkung der Art und Weise sein, wie das Schatten-Rendering implementiert wurde. Ehrlich gesagt ist der Code sehr chaotisch und schwer zu lesen, daher kann ich es Ihnen nicht sicher sagen. Sie können versuchen, den Entwicklern eine E-Mail zu senden, um weitere Informationen zu erhalten.
quelle