Entries for tag "rendering", ordered from most recent. Entry count: 187.
# Zabawy z GIMP-em #1 - Bloom
Tue
02
Jun 2009
Wiadomo, że programista to nie grafik - talentu artystycznego mieć nie musi. Ale warto umieć obsługiwać jakiś program graficzny, bo jego wykorzystanie bywa przydatne i całkiem ciekawe. Na przykład za pomocą GIMP-a możemy "statycznie" uzyskiwać efekty, które na co dzień kodujemy w czasie rzeczywistym, na GPU i za pomocą wszelkich zaawansowanych technik koderskich.
Jako przykład weźmy "słynny" efekt Bloom. Do jego wykonania posłuży darmowy GIMP. Mamy zdjęcie (Warszawa, centrum handlowe Złote Tarasy):
Duplikujemy jego warstwę (Layer / Duplicate Layer). Tą warstwę wyższą przekształcamy za pomocą krzywej (Color / Curves) tak, żeby wybrać tylko jasne obszary:
Potem tą warstwę mocno rozmywamy za pomocą Filter / Gaussian Blur:
Wreszcie przestawiamy tryb warstwy (Mode w panelu Layers) na addytywny (Addition) i Bloom gotowy - wszystko świeci! :D
Comments | #graphics #tools #rendering Share
# Za dużo blooma ;)
Sun
17
May 2009
Pokażę taki jeden mały screen, żeby udowodnić, że w domu wcale się nie nudzę. Dla tych którzy wiedzą o co chodzi: możnaby go zatytułować "za dużo blooma" :D
A tak na serio, to co teraz piszę to nie żaden silnik, tylko takie luźne eksperymenty. Luźne, ale jednak wymagają pewnej spójnej platformy. Póki co ta platforma zawiera: CommonLib, mój stary framework do Direct3D9 z TFQ7 (stary ale jary, po latach nadal nie wymyśliłem nic lepszego), konsolę zrobioną z użyciem tej zwykłej systemowej w sposób asynchroniczny, klasę kamery, zupełnie nowy manager zasobów (który potrafi wczytywać np. tekstury i shadery w tle, w osobnym wątku - zawsze o takim marzyłem, dopiero teraz miałem odwagę go napisać), podłączoną bibliotekę AntTweakBar i kilku innych drobiazgów. Słowem - minimalizm, żeby skupić się na tym o co chodzi.
A chodzi o zabawę z różnymi technikami graficznymi. Na pierwszy ogień poszły efekty postprocessingu (przede wszystkim oczywiście Bloom :D). Po napisaniu tych prostych zrobiłem sobie Deferred Shading. Teraz mając w przestrzeni obrazu dostęp do danych takich jak głębokość i normalna będę mógł policzyć dużo więcej fajnych rzeczy :) Jak skończę tą zabawę, to nieomieszkam się pochwalić (zapewne w formie filmiku YouTube), a potem przyjdzie czas na eksperymenty z generowaniem siatek i tekstur.
Ponieważ nie mam ostatnio natchnienia do pisania często notek na moim blogu, napiszcie w komentarzach, o czym chcielibyście przeczytać. Może ciekawie byłoby opisywać obszerniej i z fragmentami kodu konkretne tematy, tak jak to robi na swoim blogu SceNtriC (który przecież zajął 3 miejsce w konkursie na najlepszy blog IT)?
Comments | #rendering #productions #gallery Share
# Renderowanie kryształka i AntTweakBar
Sun
05
Apr 2009
Klejnoty, kryształy i wszelkie błyskotki to bardzo ładne obiekty, więc ciekawie jest próbować je wyrenderować :) Dawno temu przeczytałem artykuł "A Simple Method for Rendering Gemstones" (Thorsten Scheuermann, książka Game Programming Gems, tom 5). Potem wróciłem do tego tematu i trafiłem na artykuł Graphics Gems Revisited (Stephane Guy, Cyril Soler). Artykuł jest trudny i oparty na modelu fizycznym. Przy okazji z Wikipedii dowiedziałem się, że brylant to nie po prostu oszlifowany diament, ale w jubilerstwie istnieje cała obszerna sztuka nadawaniu klejnotom takiego szlifu, aby otrzymać jak najlepszą brylancję.
Jakiś czas temu spróbowałem opracować swoją, prostą metodę renderowania kryształka. Metoda opiera się na teksturze sześciennej, do której na początku jeden raz renderuję głębokość geometrii kryształka z punktu widzenia jego środka. Potem dzięki niej, podczas właściwego renderowania, w pixel shaderze liczę (bardzo) przybliżone odbicia promienia światła wewnątrz modelu, a na podstawie kąta i odległości tego odbicia obliczam końcowy kolor.
Ale nie tylko o tym chcę dzisiaj napisać. Chciałbym polecić wszystkim bibliotekę AntTweakBar. O jej istnieniu dowiedziałem się z wykładu Koshmaara na tegorocznej konferencji IGK'6-2009. Jest darmowa, banalnie prosta w użyciu, współpracuje z DirectX i OpenGL, a jej funkcja to zapewnienie arkusza właściwości (property grid) wewnątrz gry. Umożliwia edycję różnego typu danych, od bool, int, float, string, aż po enum, wektor i kwaternion. Napisanie samemu czegoś takiego to by był ogrom pracy. Przygotowałem mały filmik:
Modele kryształów pochodzą ze strony 3D Lapidary. Przy okazji do listy formatów modeli, które zdarzyło mi się w życiu wczytywać, dołączył DXF :)
Comments | #literature #rendering #libraries #gui Share
# Wycinanie komentarzy ze skompilowanego shadera
Thu
19
Feb 2009
Shader Direct3D skompilowany do kodu binarnego (np. funkcją D3DXCompileShaderFromFile) zawiera w sobie nie tylko instrukcje asemblerowe, ale i dodatkowe informacje - komentarze. Te komentarze nie są bezużyteczne. Tam zapisana jest np. tablica stałych, którą można odczytać funkcją D3DXGetShaderConstantTable. Jednak jeśli ona nie jest potrzebna, te komentarze można z kodu wyciąć i wtedy shader staje się dużo mniejszy.
Jak to zrobić? Choć trzeba grzebać wprost w pamięci, to nie jest trudne. Konkretny algorytm opisuje na swoim blogu Jesus de Santos Garcia we wpisie Stripping comments from Shader bytecodes. Ja tutaj streszczę go krótko swoimi słowami.
Format binarny skompilowanych shaderów D3D jest udokumentowany w MSDN, na stronie Direct3D Shader Codes. Składa się z sekwencji 32-bitowych tokenów. Ostatni z nich ma wartość 0x0000FFFF i oznacza koniec kodu. Komentarz natomiast rozpoczyna się tokenem 0x####FFFE, gdzie "####" (starsze dwa bajty) to liczba następujących dalej 32-bitowych wartości stanowiących treść komentarza. Takie komentarze można po prostu wyciąć z kodu shadera i gotowe :)
Comments | #directx #rendering Share
# Co wynalazł Hilbert i Morton
Mon
12
Jan 2009
Tablicę jednowymiarową można posortować, żeby przyspieszyć jej przeszukiwanie. W programowaniu gier, do przestrzeni 2D i 3D używamy technik podziału przestrzeni (jak BSP, Octree, k-d tree), bo nie sposób uporządkować punktów czy obiektów w kolejności. Jednak czy napewno?
Otóż wynaleziono funkcje, które przeliczają pozycję punktu w przestrzeni (podzielonej wprawdzie na dyskretną siatkę) na pojedynczą liczbę taką, że dwa punkty leżące blisko siebie dostają często zbliżoną wartość. Te funkcje to numer komórki wzdłuż pewnej krzywej (Space-filling curve).
Przykładem może być Morton value:
Źródło: Wikipedia
lub lepsza, ale bardziej kosztowna obliczeniowo Hilbert value:
Źródło: Wikipedia
Comments | #math #algorithms #rendering Share
# Efekty wolumetryczne #2
Tue
18
Nov 2008
Mgła wolumetryczna, ciąg dalszy. Jako funkcję gęstości wygenerowałem sobie tym razem porządną teksturę wolumetryczną - szum Perlina, tilowalny na wszystkie 3 strony. Jeśli komuś może się przydać, umieściłem ją tutaj: NoiseVolume.dds (ma rozmiar 32x32x32, jest w formacie DDS L8, plik zajmuje 32 KB). Dodałem też modulowanie gęstości przez odległość od określonego punktu lub płaszczyzny, tak żeby mgła mogła zanikać w danym kierunku.
# Efekty wolumetryczne
Sun
16
Nov 2008
Odgrzebałem dzisiaj swój framework z wakacji, który służy do eksperymentowania i poeksperymentowałem z efektami wolumetrycznymi próbując otrzymać coś w rodzaju mgły. Rysuję bryłę wypukłą, a dla każdego piksela śledzę promień od kamery przez ten punkt wgłąb bryły. Wzdłuż tego promienia kilka razy próbkuję jakąś funkcję gęstości od (x,y,z). To tak jakbym liczył numerycznie całkę. Najlepiej to wygląda, kiedy gęstość jest po prostu odczytywana z przefiltrowanej tekstury wolumetrycznej zawierającej zwykły szum. Największym problemem było ustalić, jaką głębokość ma bryła w danym miejscu ekranu. Rozwiązałem to renderując głębokość tylnych ścianek obiektu (CullMode = CW) do osobnej tekstury R32F, którą potem odczytuję.
# Kompresja tekstur DXT
Sat
08
Nov 2008
W amatorskich grach tekstury zapisujemy zwykle w "tradycyjnych" formatach plików, np. TGA. Ci, którzy piszą w DirectX mają ten komfort, że ich biblioteka potrafi sama z siebie wczytywać różne formaty plików. Pośród nich jest DDS - naturalny format DirectX-a, którego możliwości są takie jak różnorodność formatów dostępnych dla tekstur przechowywanych w pamięci. Programy graficzne można skłonić do obsługi tego formatu instalując darmową wtyczkę (do Photoshopa, do GIMP-a). Można też konwertować tekstury na ten format za pomocą DirectX Texture Tool - programu dołączonego do DX SDK.
Pośród formatów, w jakich może być obrazek zapisany w pliku DDS (jak i wczytana z niego do pamięci tekstura) warto wymienić formaty skompresowane DXT. Stosowana w nich kompresja używa bardzo ciekawego algorytmu, w niczym niepodobnego do np. JPEG. Każdy blok 4x4 teksele jest zapisany w postaci dwóch kolorów R5G6B5 oraz, dla każdego teksela, dwóch bitów mówiących o interpolacji między tymi kolorami. W ten sprytny sposób można w takim bloku zapisać równie dobrze płynny gradient, co ostrą krawędź. Format DXT1 służy do tekstur nieprzezroczystych lub z 1-bitowym kanałem Alfa, a DXT5 obsługuje zróżnicowane wartości Alfa. DXT1 poświęca 8 bajtów na blok, a DXT5 - 16 bajtów na blok. Niestety, do kompresji normal map żaden z nich się nie nadaje i dlatego badacze próbują na różne sposoby rozwiązać ten problem.
Podsumowując, warto stosować format pliku DDS, a użycie odpowiedniego formatu tekstury zaoszczędzi miejsca zarówno na dysku, jak i w pamięci karty graficznej (tam też tekstury DXT leżą nadal w postaci skompresowanej!), bez zauważalnej straty jakości.