Autor Wątek: [DX9] Renderowanie do tekstury, multisampling  (Przeczytany 1655 razy)

Offline radsun

  • Użytkownik
    • CaRpg

# Czerwiec 13, 2014, 12:13:55
Witam!
W menu mam tworzenie postaci gdzie renderuje do tekstury animowany model postaci. Wszystko działa dobrze o ile nie włączę multisamplingu. Gdy jest włączony wygląda jakby z-bufer był wyłączony.

Oto co robię:
1. Tworzę teksturę 128x256
2. W czasie aktualizacji:
SURFACE surf;
//device->SetRenderState(D3DRS_ZENABLE, TRUE);
//device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE);
V( tChar->GetSurfaceLevel(0, &surf) );
V( device->SetRenderTarget(0, surf) );
V( device->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0x00FFFFFF, 1.f, 0) );
V( device->BeginScene() );

// renderowanie

V( device->EndScene() );
surf->Release();
V( device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surf) );
V( device->SetRenderTarget(0, surf) );
surf->Release();

Patrzałem co tam widać w pixie i wyskakuje komunikat "The current file is using multisampling. Would you like to disable multisampling, so the pixel history will match the render targets?". Jak dam tak to wszystko jest ok, jak nie to wygląda tak jak widać. Debugowałem pixel tarczy i pisze że został odrzucony przez depth test a pomimo tego i tak go widać.

Próbowałem utworzyć DepthStencilBuffer o rozmiarze 128x256 ale nic to nie zmieniło.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xirdus

  • Redaktor

# Czerwiec 13, 2014, 12:29:12
Przerzuc sie na DX10/11, serio.

Offline radsun

  • Użytkownik
    • CaRpg

  • +3
# Czerwiec 13, 2014, 12:43:03
Dziękuje za jakże pomocną podpowiedź, póki ma działać pod windows xp muszę zostać przy tym.

Offline Xirdus

  • Redaktor

# Czerwiec 13, 2014, 13:10:23
Windows XP tez ma DX10. Zreszta ten system jest oficjalnie martwy (12 lat juz!).

Offline radsun

  • Użytkownik
    • CaRpg

  • +1
# Czerwiec 13, 2014, 14:42:59
Problem rozwiązany. Rozwiązanie dla potomnych:

Inicjalizacja:
TEX tChar;
SURFACE sChar;

V( device->CreateRenderTarget(128, 256, D3DFMT_A8R8G8B8, (D3DMULTISAMPLE_TYPE)ms, msq, FALSE, &sChar, NULL) );

V( device->CreateTexture(128, 256, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tChar, NULL) );

Renderowanie:
V( device->SetRenderTarget(0, sChar) );
V( device->Clear(0, NULL, D3DCLEAR_ZBUFFER | D3DCLEAR_TARGET, 0, 1.f, 0) );
V( device->BeginScene() );

// renderowanie

V( device->EndScene() );

// kopiuj do tekstury (usuwa multisampling)
SURFACE surf;
V( tChar->GetSurfaceLevel(0, &surf) );
V( device->StretchRect(sChar, NULL, surf, NULL, D3DTEXF_NONE) );
surf->Release();

// przywróć back buffer
V( device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &surf) );
V( device->SetRenderTarget(0, surf) );
surf->Release();