Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[PROBLEM] DX9 Reset() device psuje splatting terenu na nowych sterownikach NVIDIA


Rekomendowane odpowiedzi

Opublikowano (edytowane)

Witam

 

Mam problem z klientem na silniku DirectX 9. Po Ctrl+Alt+Delete (lub UAC), gra wykonuje Reset() device i odtwarza wszystkie stany. Tekstury terenu (splatting) przestają działać – Stage 1 multitexturing nie miesza tekstur (są kwadratowe przejścia zamiast płynnych).

 

Co sprawdziłem:

 

Wszystkie samplery, texture stage states, transformacje – ustawione poprawnie po resecie

Tekstury tworzone od nowa przez D3DPOOL_MANAGED + LockRect

Vertex bufory – OK

SetTexture(1, itd) – wywoływane

Stage 1 ColorOp/AlphaOp – ustawione na SELECTARG1

 

Logi potwierdzają że wszystko jest identyczne przed i po resecie

 

Kod działa poprawnie – problem znika dopiero po pełnym restarcie gry (nowy CreateDevice). Teleport/reload mapy NIE pomaga.

 

Testowane na:

Windows 10 64-bit

NVIDIA GTX 1060 6GB, sterownik 32.0.15.8180

DirectX 12 (klient po migracji na DX9)

 

 

UPDATE : 

 

 

Problem rozwiązany poniżej rozwiązanie

 

 

W statemanager.cpp szukamy 

 

#ifdef _DEBUG
    int i, j;
    for (i = 0; i < STATEMANAGER_MAX_RENDERSTATES; i++)
        m_bRenderStateSavingFlag[i] = FALSE;

    for (j = 0; j < STATEMANAGER_MAX_TRANSFORMSTATES; j++)
        m_bTransformSavingFlag[j] = FALSE;

    for (j = 0; j < STATEMANAGER_MAX_STAGES; ++j)
        for (i = 0; i < STATEMANAGER_MAX_TEXTURESTATES; ++i)
            m_bTextureStageStateSavingFlag[j][i] = FALSE;
#endif _DEBUG

 

 

pod spodem dodajemy

 

 

 

#ifdef DX9_BLUR_FIX
    if (!m_lpD3DDev)
        return;

    D3DCAPS9 d3dCaps = {};
    m_lpD3DDev->GetDeviceCaps(&d3dCaps);

    m_dwBestMagFilter = (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MAGFANISOTROPIC)
        ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;

    m_dwBestMinFilter = (d3dCaps.TextureFilterCaps & D3DPTFILTERCAPS_MINFANISOTROPIC)
        ? D3DTEXF_ANISOTROPIC : D3DTEXF_LINEAR;

    DWORD dwMax = d3dCaps.MaxAnisotropy;
    if (dwMax > 4) dwMax = 4;

    if (dwMax > 1) {
        for (int i = 0; i < 3; ++i) {
            m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, dwMax);
            m_lpD3DDev->SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
            m_lpD3DDev->SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
            m_lpD3DDev->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
        }
    }
#endif

 

 

 

W locale_inc.h dodajemy na końcu

 

#define DX9_BLUR_FIX 

 

 

Edytowane przez adrian5523

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...