d3d8: multisampling aktivieren - blackscreen



  • Hi!

    Ich würde gerne bei einem Spiel (kein source vorhanden) multisampling (anti-aliasing) aktivieren.
    Dazu habe ich einen IDirect3D8::CreateDevice()-Hook gesetzt und "d3dPP.MultiSampleType" testweise auf "D3DMULTISAMPLE_2_SAMPLES" gesetzt.
    Leider wird dann aber das Menü des Spiels nicht angezeigt (blackscreen), der Sound (theme) funktioniert aber.
    Ändere ich die Farbe bei IDirect3DDevice8::Clear(), sieht man diese, sonst aber nichts. Es ist also nicht zwingend ein blackscreen, aber es wird einfach nichts angezeigt.

    Woran könnte das liegen? Es ist nur im Menü so. Setze ich erst im Spiel (3D) das multisampling, funktioniert das auch (Allerdings umständlich mittels IDirect3DDevice8::Reset()-Hook, und man muss einmal minimieren und wieder maximieren, damit das aufgerufen wird).

    Und wenn ich im Treiber anti-aliasing aktiviere, gibt es das Problem nicht!

    Woraus das Menü besteht, kann ich nicht sagen. Es ist in 2D gehalten, vermutlich einfach texturierte faces.
    Allerdings lädt das Spiel neben d3d8.dll auch DDRAW.DLL...

    Wie könnte ich das angehen?



  • Ich würde das einfach per Treiber erzwingen.

    Es kann durchaus sein, dass das Menü mit DDraw gerendert wird. Dabei könnte es zu Problemen mit dem Rendertarget kommen. Das RT ist multisampelt und DDraw weiß nichts davon. Ist aber nur eine Vermutung.



  • An DDraw liegt es wohl doch nicht, DirectDrawCreate() wird nicht aufgerufen.
    d3dDevice8-CreateRenderTarget() wird ebenfalls nicht aufgerufen.

    Im Menü sehen die d3dDevice8 Aufrufe so aus:

    Clear (pRects: 0 / 800 / 0 / 600 - Flags: D3DCLEAR_ZBUFFER)
    GetBackBuffer
    BeginScene
    SetRenderState (State: D3DRS_FILLMODE - Value: D3DFILL_SOLID)
    EndScene
    SetTransform (State: D3DTS_VIEW)
    SetTransform (State: D3DTS_PROJECTION)
    TestCooperativeLevel
    Present (pDestRect != NULL im Fenstermodus)
    // Und wieder von vorn
    

    //EDIT:
    (Wichtige) Argumente der Aufrufe hinzugefügt

    //EDIT2:
    Hab noch was rausgefunden:
    In einem bestimmten Teil des Menüs wird auch ein 3D Objekt gezeichnet. In diesem Menüteil habe ich dann multisampling aktiviert (device reset erzwungen) und Folgendes ist passiert:
    Das Menü blieb stehen, konnte aber nicht weiter bedient werden. Das 3D Objekt bewegte sich weiter, hat aber immer mehr Schlieren gezogen, der Hintergrund (2D Menü) wurde also nicht mehr aktualisiert.

    Inzwischen bin ich mir ziemlich sicher, dass das Menü mit GDI32 gezeichnet wird (Deshalb auch der GetBackBuffer()-Aufruf, und keine DrawPrimitive...etc).
    Hmm...


Anmelden zum Antworten