[D3D] Finde kein erlaubtes Depthbuffer-Format, wieso nicht?
-
Ich habe einen Computer, der schon etwas betagter ist, aber noch nicht steinalt. Auf diesem Computer kann mein Programm kein Device erstellen, weil ich kein DepthFormat finde, das erlaubt ist.
Ich verwende folgenden Code, um das Device zu erstellen:
device = new Device( 0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing | CreateFlags.FpuPreserve, createPresentParameters() );Meine PresentParameters sehen so aus:
private PresentParameters createPresentParameters() { PresentParameters settings = new PresentParameters(); settings.BackBufferCount = 1; settings.BackBufferWidth = Program.Settings.Resolution.Width; settings.BackBufferHeight = Program.Settings.Resolution.Height; settings.BackBufferFormat = pixelFormat; settings.PresentationInterval = PresentInterval.Immediate; settings.FullScreenRefreshRateInHz = Program.Settings.FullScreen ? Program.Settings.RefreshRate : 0; settings.Windowed = !Program.Settings.FullScreen; settings.DeviceWindow = this; settings.SwapEffect = SwapEffect.Flip; settings.EnableAutoDepthStencil = true; DepthFormat depthFormat = findDepthFormat(); Program.writeLog("Depthbuffer Format: " + depthFormat); settings.AutoDepthStencilFormat = depthFormat; return settings; }Und das eigentliche Problem macht jetzt die Methode, die ein geeignetes DepthFormat auswählen soll:
private DepthFormat findDepthFormat() { if( checkDepthFormat(DepthFormat.D16) ) return DepthFormat.D16; else if( checkDepthFormat(DepthFormat.D16Lockable) ) return DepthFormat.D16Lockable; else if( checkDepthFormat(DepthFormat.L16) ) return DepthFormat.L16; else if( checkDepthFormat(DepthFormat.D32) ) return DepthFormat.D32; else if( checkDepthFormat(DepthFormat.D32SingleLockable) ) return DepthFormat.D32SingleLockable; else if( checkDepthFormat(DepthFormat.D24X8) ) return DepthFormat.D24X8; else throw new Direct3DXException("could not find a valid depth format"); } private bool checkDepthFormat(DepthFormat format) { return Manager.CheckDepthStencilMatch( 0, DeviceType.Hardware, pixelFormat, pixelFormat, format ); }"pixelFormat" ist dabei eine Konstante mit dem Wert Format.X8R8G8B8, die ich auch als BackbufferFormat benutze.
Die Ausgabe meines Programms auf diesem Computer ist:
NVIDIA GeForce4 Ti 4200 (Microsoft Corporation) nv4_disp.dll(6.14.10.5673) A CRITICAL EXCEPTION OCCURED: Microsoft.DirectX.Direct3D.Direct3DXException: could not find a valid depth format at graphics.GraphicsEngine.findDepthFormat() at graphics.GraphicsEngine.createPresentParameters() at graphics.GraphicsEngine.createDevice() at graphics.GraphicsEngine.initializeDirect3D() at graphics.GraphicsEngine..ctor() at core.Program.Main()Mache ich bei der Suche nach dem passenden Format etwas falsch? Ist es richtig, bei CheckDepthStencilMatch() für beide Parameter (namentlich adapterFormat und renderTargetFormat) das Format des Backbuffers (pixelFormat-Konstante) zu übergeben? Wie ihr seht, probiere ich eine Menge möglicher Formate aus, dabei erscheinen mir schon gar nicht alle sinnvoll, aber es geht wirklich keins. Es ist auch tatsächlich so, dass das Erstellen des Device fehlschlägt, wenn ich die Exception nicht werfe, das ist aus dem obigen Code jetzt nicht ersichtlich, weil der Device-Konstruktor hier nie aufgerufen wird.
-
Bei mir (c++) sieht die Sache so aus:
// Ausschnitt aus Enumerator.cpp // Info: Enumerator läuft bei mir rekursiv nach utnen, also für jeden Adapter ruft er EnumerateDevices(), usw. auf void Enumerator::EnumerateDepthStencilFormats () // Wird von EnumerateDisplayModes() aufgerufen { // Depth/Stencil-Format [D24S8] mode.depthStencilFormat = D3DFMT_D24S8; // mode ist der aktuell gefundene mode if(CheckDepthStencilFormat()) EnumerateMultiSampleTypes(); // nächster rekursions-schritt } bool CheckDepthStencilFormat () { Result res = d3d->CheckDepthStencilMatch(mode.adapter,mode.device,mode.format,mode.format,mode.depthStencilFormat); return SUCCEEDED(res); }Die Check-Funktion sieht also ziemlich so aus wie bei dir. Kanns nicht ganz einfach sein, dass deine Karte noch keine Auto-DepthBuffer unterstützt? Schau mal auf der Caps-Seite von Energyzer (oder wars jemand anders, hats auf jeden fall hier in der sig) nach!
BTW: Würde ich an deiner Stelle vorher wissen wollen ob ich Lockable-Formate enumeriere oder NonLockable-Formate! Also beschränk dich auf eins...ich kontrollier zB nur D32 und D24S8
MfG SideWinder
-
Ja, das war nur noch wildes durchprobieren. Ich werd mich wieder auf sinnvolle Formate beschränken. Ob die Karte generell Auto-Depthbuffer unterstützt, versuche ich mal rauszufinden, vielleicht kriegt man das über die Device-Caps raus.
EDIT: Hmmm ne, ich finde kein Device-Cap nach dem Motto SupportsAutoDepthbuffer. Sowas scheint es nicht zu geben, kann es wirklich sein, dass eine Karte das nicht unterstützt?
-
Wie gesagt, schau auf Energyzers Page, der hat ne tolle Sammlung!
Hab dir den Link rausgesucht: http://www.fheinemann.de/caps
MfG SideWinder
-
Viele nVidia Karten können nicht alle Kombinationen. Zu einem 32Bit Farbformat geht nur D24S8, zu 16 Bit Farben nur D16. Und mit dem DXSDK kommt übrigens ein Capsviewer.
Bye, TGGC
-
Optimizer schrieb:
EDIT: Hmmm ne, ich finde kein Device-Cap nach dem Motto SupportsAutoDepthbuffer. Sowas scheint es nicht zu geben, kann es wirklich sein, dass eine Karte das nicht unterstützt?
"Auto Depth Buffer" ist kein Feature der Grafikkarte.
Damit sagst Du Direct3D nur, dass Du zu faul bist, um den Z-Buffer selbst zu erstellen
Funktionieren denn die SDK-Beispielprogramme?
Wenn ja: dann steht oben immer, welches Z-Buffer-Format er genommen hat.
Wenn nein: neuesten Treiber installieren.
-
"Auto Depth Buffer" ist kein Feature der Grafikkarte.
Aber DepthBuffer, das meinte er ja wohl

MfG SideWinder
-
TGGC schrieb:
Viele nVidia Karten können nicht alle Kombinationen. Zu einem 32Bit Farbformat geht nur D24S8, zu 16 Bit Farben nur D16. Und mit dem DXSDK kommt übrigens ein Capsviewer.
Sollte D24S8 immer gehen? Funktionieren tut es zwar auf diesem Rechner immer noch nicht,
Scheinbar liegt es jetzt auch noch an etwas anderem. Ich kann auch völlig ohne Auto-Depthbuffer kein Device erstellen, eigentlich geht auf diesem Rechner wirklich gar nichts. Gibt es eine schlaue Möglichkeit, herauszufinden, was NOTAVAILABLE ist, wenn man auf dem Zielrechner nur ein eingeschränktes Konto hat? In der Systemsteuerung unter DirectX was auf Debug umstellen geht jedenfalls nicht.Achja, mein neues findDepthFormat() mit anderen Formaten findet aber auch D24S8 nicht, ist diese Funktion überhaupt schon mal korrekt implementiert oder muss ich das anders prüfen?
TomasRiker schrieb:
Optimizer schrieb:
EDIT: Hmmm ne, ich finde kein Device-Cap nach dem Motto SupportsAutoDepthbuffer. Sowas scheint es nicht zu geben, kann es wirklich sein, dass eine Karte das nicht unterstützt?
"Auto Depth Buffer" ist kein Feature der Grafikkarte.
Ja, ein Cap gibt es jedenfalls dafür nicht.
Funktionieren denn die SDK-Beispielprogramme?
Wenn ja: dann steht oben immer, welches Z-Buffer-Format er genommen hat.
Wenn nein: neuesten Treiber installieren.Werd ich mal probieren. Sehe ich das richtig, dass du es für wahrscheinlich hältst, dass ein neuerer Treiber her muss?
Danke an alle schon mal für die Vorschläge.
SideWinder schrieb:
"Auto Depth Buffer" ist kein Feature der Grafikkarte.
Aber DepthBuffer, das meinte er ja wohl

Nene, ich hab deine Aussage
Kanns nicht ganz einfach sein, dass deine Karte noch keine Auto-DepthBuffer unterstützt?
aufgegriffen und vielleicht misinterpretiert. Ist jetzt auch egal.

-
Optimizer schrieb:
TGGC schrieb:
Viele nVidia Karten können nicht alle Kombinationen. Zu einem 32Bit Farbformat geht nur D24S8, zu 16 Bit Farben nur D16. Und mit dem DXSDK kommt übrigens ein Capsviewer.
Sollte D24S8 immer gehen?
Wie gesagt bei älteren NV-Karten nicht. Da ist 24 Z-buffer nicht für alle Farbformate gültig.
Bye, TGGC
-
Ok, das Thema hat sich erledigt. Ich habe erwirkt, dass auf dem Rechner ein neuer Grafikkartentreiber installiert wird. Außerdem war der Regler in der Systemsteuerung für die Hardwarebeschleunigung runtergestellt. Ich vergeude immer gerne wieder einen halben Tag mit so einem Fuck.

Auf jeden Fall danke, dass ihr mir helfen wolltet. D24S8 funktioniert dort übrigens.
-
Optimizer schrieb:
Ich vergeude immer gerne wieder einen halben Tag mit so einem Fuck.

Liese sich das nicht optimizen?

Bye, TGGC