Zaawansowane rysowanie tekstu w C#Pisząc różnego rodzaju aplikacje (i gry), chcielibyśmy czasami mieć większa możliwość dostosowania parametrów rysowanego tekstu niż tylko krój, rozmiar i kolor. W .NET jest to bardzo proste -- pokażę dzisiaj jak łatwo można to osiagnać za pomocą GraphicPath.
Artykuł: Proste przetwarzanie obrazówWe Wrocławskim Portalu Informatycznym (WPI) pojawił się artykuł mojego autorstwa: "Proste przetwarzanie obrazów". W przygotowaniu są już kolejne artykuły (tym razem związane z tematyką programowania gier) i powinny pojawiać się mniej więcej raz w miesiącu.
Na potrzeby artykułu poduczyłem się trochę Javy (żeby zrobić aplety) i muszę przyznać, że nie było to zbyt przyjemne doświadczenie. Tak, jestem językowym rasistą i zdecydowanie wolę C# ;).
Zdradzieckie DPI w plikach PNGBiblioteka GDI+ stara się być czasami sprytniejsza niż byśmy tego chcieli i podczas rysowania uwzględnia informację o DPI zawartą w pliku (jest to chunk pHYs), co czasami może przełożyć się na dziwne rezultaty. Jak dziwne? Weźmy jedną grafikę i narysujmy ją z DPI 72, 96 i 300, efekt jest taki:

Może się przez to okazać, że nasze narzędzia generujące grafiki będą dawać dziwne rezultaty. Na dodatek standardowo używane jest DPI z ustawień systemu (standardowo 96), które użytkownik naszego narzędzia może mieć zmienione.
Niektóre narzędzia przetwarzające obrazy zapisują błędnie informację o DPI, o czym przekonałem się parę dni temu, gdy 1/3 grafik testowych (które sam kiedyś tworzyłem) miała złe DPI.
Jak można temu zaradzić? Jako, że nas będą interesować tylko piksele, możemy zmienić DPI wczytanego obrazu za pomocą metody SetResolution i tak samo zrobić dla obrazu, który generujemy -- dzięki temu wszystkie będą miały takie samo DPI i problem powinien zniknąć.
Bitmapa o bezpośrednim dostępie do pikseli w C#Kiedy w C# chcemy zmodyfikować zawartość bitmapy, możemy zrobić to na kilka sposobów. Pierwszym jest użycie metod GetPixel i SetPixel. Niestety ich wydajność pozostawia wiele do życzenia.
W większości tutoriali opisujących przetwarzanie bitmap, używa się metody Lock, aby dostać się do danych pikseli. Niestety metoda ta narzuca użycie unsafe w naszym kodzie, a poza tym brzydko wygląda.
Okazuje się, że jest jeszcze trzecia metoda, która jest rzadko opisywana -- stworzyć bitmapę na wcześniej przydzielonym obszarze pamięci. Dzięki temu mamy od razu dostęp do jej danych, bez potrzeby wcześniejszego jej blokowania. Taką bitmapę można używać normalnie do rysowania, można też utworzyć powiązany z nią Graphics, żeby po niej rysować. Ważne jest, żebyśmy zablokowali pamięć, której będzie używała taka bitmapa, żeby Garbage Collector jej nie przemieścił.
W dalszej części znajduje przykładowy kod, który robi prostą animację na takiej bitmapie o bezpośrednim dostępie.

Deferred shadingDeferred shading jest coraz popularniejszą techniką oświetlenia. Idea jest bardzo prosta i wydaje się łatwa w implementacji. Szukając informacji na jej temat zebrałem odnośniki do kilku artykułów i postanowiłem się nimi podzielić:
Jak widać jest tego sporo i możemy zobaczyć jak to robią inni zanim zabierzemy się do implementacji.
Artykuły