Poniższy obraz pokazuje dwa duszki renderowane z próbkowaniem punktowym na górze tła:
- Do lewej czaszki nie zastosowano obrotu / skalowania, więc każdy piksel idealnie pasuje do tła.
- Prawa czaszka jest obracana / skalowana, co powoduje, że większe piksele , które nie są już wyrównane względem osi .
Jak mogłem opracować moduł cieniujący piksele, który renderowałby przekształconego duszka po prawej stronie z pikselami wyrównanymi do osi o tym samym rozmiarze co reszta sceny?
Może to być związane z tym, jak skalowanie sprite zostało zaimplementowane w starych grach, takich jak Monkey Island, ponieważ taki efekt staram się osiągnąć, ale z dodaną rotacją.
Edytować
Zgodnie z sugestiami kaoD starałem się rozwiązać problem jako post-proces. Najłatwiejszym podejściem było najpierw renderowanie do oddzielnego celu renderowania (próbkowanie w dół w celu dopasowania do pożądanego rozmiaru pikseli), a następnie przeskalowanie go podczas renderowania po raz drugi. To spełniło moje wymagania powyżej.
Najpierw próbowałem to zrobić Linear -> Point
i wynik był następujący:
Nie ma zniekształceń, ale efekt wygląda rozmazany i traci większość kolorów świateł. Moim zdaniem psuje wygląd retro, którego potrzebowałem.
Drugi raz próbowałem Point -> Point
i wynik był następujący:
Pomimo zniekształceń, myślę, że może to być wystarczające na moje potrzeby, chociaż lepiej wygląda jako zdjęcie nieruchome niż w ruchu.
Aby to zademonstrować, oto film przedstawiający efekt, chociaż YouTube odfiltrował z niego piksele:
Pozostawię jednak pytanie otwarte na kilka dni, na wypadek, gdyby ktoś wpadł na lepsze rozwiązanie próbkowania, które zachowuje ostry wygląd, jednocześnie zmniejszając zniekształcenie podczas ruchu.
SpriteBatch
wymaga użycia trybu natychmiastowego, więc nie jest to warte kłopotu. Pójdę z tym :)