Autor Wątek: [XNA] Straszny błąd - RenderTarget-y + Additive Mode  (Przeczytany 738 razy)

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 24, 2011, 10:28:59
Cześć. Od pewnego czasu próbuję dodać efekt glow do świateł w mojej grze i jak na razie udało się to zrobić wyłącznie dla laserów, podczas gdy dla tekstur na statkach gra całkowicie się rozjeżdża. Ciężko jest opisać w tym wątku mój problem ponieważ gra ma już kilka tysięcy linii kodu - aczkolwiek już dawno nie miałem takiego błedu jak ten (spędziłem cały, dosłownie cały dzień na wychwyceniu co jest nie tak, przegooglowałem pół internetu i ciągle dzieją się dziwne rzeczy).

Jeżeli chodzi o rendertargety to robię wszystko chyba dobrze:
1. Ustawiam rendertarget w sposób GraphicsDevice.SetRenderTarget(0,[nazwaRenderTargetu])
2. Robię jakieś rysowanie
3. Ustawiam z powrotem na backbuffer czyli GraphicsDevice.SetRenderTarget(0,null)

Plik Game.cs
http://pastebin.com/dH2Jrs6A

Plik MotherShip.cs
http://pastebin.com/tBtS5nM6

Plik PostProcessGlow.cs
http://pastebin.com/g6svUjCN

Przepraszam za taką jakość kodu ale jest on w ciągłej przebudowie ze względu na ten błąd, ciąglę go debuguje na różne sposoby (stąd tyle wykomentowanych wierszy)

Generalnie klasa MotherShip dziedziczy po klasie Ship i wywołuje w funkcji Draw raz base.Draw (czyli draw z SpaceShip-a) dla tekstury diffuse, a drugi raz na tym samym rendertargecie co lasery base.Draw ale z teksturą czarnobiałą, gdzie białe miejsca to światła a czarne to brak światła (bo finalnie rendertarget rysowany jest w trybie addytywnym w spriteBatch -> Game.cs)

Problem jest taki, że kiedy rysuję statki tło rendertargetu czyści się do fioletowo-różowego koloru, a nigdzie nie ma takiej instrukcji, która by do takiego koloru czyściła.

Załączam zrzut z rendertargetu dla laserów (jest on również rendertargetem dla statków, a dokładniej ich oświetlenia). Załączam również shader dla statków, może okaże się pomocny.

Panowie, szukam nie tyle co gotowego rozwiązania tego problemu (choć nie ukrywam, że byłoby wspaniale wiedzieć co robię nie tak) ale przynajmniej wskazówek, jak byście to debugowali?

Z góry dziękuję za wszelką pomoc.


Offline Mr. Spam

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

Offline komorra

  • Użytkownik
    • Blog naszego teamu (o grze Voxelfield)

# Styczeń 24, 2011, 13:02:19
Dobra, przeorganizowałem część kodu w myśl zasady: jeżeli jedna rzecz działa a druga nie działa, zrób drugą w ten sam sposób co pierwsza. No i jakoś działa. Jakieś rady na przyszłość? btw zakładam projekt na assembli bo bedzię wygodniej powrócić do stanu "działającego"