Úloha 125: generování obrázku s anti-aliasingem

Úkolem je procedurálně generovat nějaký 2D rastrový obrázek a použít při tom anti-aliasing. Pro každý pixel bude spuštěna Vaše funkce, která jako výsledek vrátí jeho barvu.

Example

Základ

Úloha je modifikací úlohy 123 – její obohacení o anti-aliasing.

Budete pracovat v prostředí projektu 117raster z repository grcis (GIT). Je připravena aplikace, jejíž popis je na této stránce

Vaše řešení bude používat modul ModuleFormula, o kterém již byla řeč. Pomocí CS-scriptu můžete pohodlně definovat funkci, která se pak spustí pro každý pixel obrázku (formula.pixelCreate). Pokud budete chtít číst parametry z textového pole Param:, nadefinujete i funkci formula.contextCreate.

Alternativní možnost (pro pohodlnější editování zdrojáku ve Visual Studiu): místo CS-scriptu můžete Vaši implementaci psát rovnou v plnohodnotném jazyce C# podle vzoru modulu ModuleFormulaInternal. Logika věci je zachována, platí tedy popis uvedený níže. Jen se kód implementací neukládá v CS-scriptu, ale přímo v C# zdrojáku, který je součástí Vašeho projektu. Budete mít veškerý komfort editoru Visual Studia, naopak budete muset při každé změně aplikaci 117raster ukončit, přeložit a znova nastartovat (a znova aktivovat příslušný modul).

Příkladem scriptů, který se dají použít pro generování obrázků, jsou Contrast.cs a Swap.cs (oba najdete v adresáři projektu 117raster) nebo Checker4.cs (součástí podpůrných dat k úloze 123 – archiv ke stažení). První z nich umí vygenerovat barevnou visualizaci funkce sinc(R2), ve druhém je podobná furmulka, avšak s diskrétním výsledkem a nepoužívající gonimetrické funkce.

Ve scriptu Swap.cs se můžete podívat, jak se mohou číst hodnoty z textového pole Param:. Pokud budete chtít nějakou hodnotu (parametr) předat do funkce formula.pixelCreate, vložíte ji do mapy Dictionary<string, object>, ta se vrací z funkce formula.contextCreate. Později ji v ic.context budou mít k dispozici pixelové funkce. Například v Swap.cs se mj. čte parametr "freq" definující frekvenci soustředných kruhů. Pozn: formula.pixelCreate se dá použít pro libovolné předzpracování, výsledky jsou uloženy v mapě Dictionary<string, object> a budou přístupné všem pixelovým funkcím.

Alternativa: Příkladem modulu, který je součástí projektu, je modules/Formula/ModuleFormulaInternal.cs. Najdete tam třídu ModuleFormulaInternal, podle které si napíšete svou vlastní implementaci. Nezapomeňte změnit Vaše iniciály a modul nějak vhodně nazvat, aby se dal snadno najít v list-boxu všech přítomných modulů. Tento váš zdrojový soubor přidejte do projektu 117raster.csproj. Nakonec mi ho odevzdáte jako řešení úlohy číslo 125.

Náměty

Použijte klidně svůj námět z úlohy 123 (pokud je na to vhodný) nebo můžete upravit mou "nekonečnou šachovnici", kterou najdete v souboru Checker4.cs (v podpůrných souborech úlohy 123).

Jako techniku anti-aliasingu doporučujeme použít super-sampling (viz přednášku) a nezapomeňte úroveň převzorkování dát do uživatelského parametru.

Svoje řešení prosím naprogramujte do podobného souboru jako je Contrast.cs nebo Swap.cs. Je potřeba definovat funkci formula.pixelCreate a případně formula.contextCreate pro parsing parametru.

Alternativa: pixelové funkce napíšete do Vaší nové třídy napsané podle vzoru modules/Formula/ModuleFormulaInternal.cs. Nastavení lambda-funkcí se nachází v metodě GetFormula().

Co odevzdat

Váš soubor s CS-scriptem, do komentáře připište stručný návod k použití, obzvlášť pokud budete používat parametry (uveďte jejich význam a povolený rozsah hodnot – například do tzv. tooltipu).

Alternativa: zdrojový soubor Vaší nové třídy, která je potomkem ModuleFormula.

Termín

Odevzdat do: 19. 12. 2021

Body

4 až 8 bodů podle zajímavosti, bonus za použití parametrů, za nový nápad (oproti Vašemu řešení úlohy 123 nebo nekonečné šachovnici Checker4.cs). Oceníme též, když budete umět anti-aliasing pomocí parametru vypnout a zapnout i řídit jeho úroveň.

Projekt

Visual Studio projekt: 117raster

Zdrojový soubor

Jeden zdrojový soubor (CS-script), který lze použít jako plugin v modulu ModuleFormula. Nebo zdrojový soubor s implementací Vaší nové třídy, která je potomkem ModuleFormula.

Výsledky na ukázku

1 spp
No supersampling: 1 spp
4 spp
2x2 supersampling
16 spp
4x4 supersampling
1024 spp
32x32 supersampling
4096 spp
64x64 supersampling

Copyright (C) 2020-2021 J.Pelikán, last change: 2021-12-29 22:09:39 +0100 (Wed, 29 Dec 2021)