Android OpenGL. Pokročilé shadery

Podobné dokumenty
Android OpenGL. Práce s texturami

Fakulta informačních technologíı. IZG cvičení 6. - Zobrazování 3D scény a základy OpenGL 1 / 38

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Principy objektově orientovaného programování

Programování shaderů GLSL

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

8 Třídy, objekty, metody, předávání argumentů metod

Reprezentace 3D modelu

Programování v C++ 3, 3. cvičení

Teoretické minimum z PJV

Generické programování

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

Fakulta informačních technologíı. Rendering Seminář 1. 1 / 28

Projekt Obrázek strana 135

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

20. Projekt Domácí mediotéka

JSR tutorial 2 Transformace v JSR-184

Připravil: David Procházka. Shadery

Osvětlování a stínování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Mnohotvarost (polymorfizmus)

Konstruktory a destruktory

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Pokročilé osvětlovací techniky Josef Pelikán, MFF UK Praha

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Transformace (v OpenGL) příklady a knihovna GLM

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Programování v C++ 1, 6. cvičení

Programování v Javě I. Leden 2008

Programování v C++ 2, 4. cvičení

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Jazyk C# (seminář 3)

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Připravil: David Procházka. Vertex Buffer Objects

Programování v C++ 1, 5. cvičení

Úvod do programovacích jazyků (Java)

Šablonovací systém htmltmpl vypracoval: Michal Vajbar, Šablonovací systém htmltmpl

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Matematika pro real-time grafiku

PB161 Programování v jazyce C++ Přednáška 7

Př. program s popojíždějícím autíčkem o 50 pixelů při každém stisku Popojeď

PB161 Programování v jazyce C++ Přednáška 7

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

VZÁJEMNÁ POLOHA DVOU PŘÍMEK V ROVINĚ

PREPROCESOR POKRAČOVÁNÍ

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Programování v Javě I. Únor 2009

1 Projekce a projektory

Projekty pro výuku programování v jazyce Java

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Návod k použití softwaru Solar Viewer 3D

Programování v jazyce C a C++

Úvod do programovacích jazyků (Java)

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Lineární algebra Operace s vektory a maticemi

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

14. přednáška. Přímka

Více o konstruktorech a destruktorech

Java - Kresba. 2/28/11 1/8 Java - kresba

Java a XML. 10/26/09 1/7 Java a XML

JSR tutorial 1 Úvod do JSR-184

Hierarchický model Josef Pelikán CGG MFF UK Praha. 1 / 16

TAM. Prezentace přednášek. Ústav počítačové grafiky a multimédií

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Dědění, polymorfismus

Hardware pro počítačovou grafiku NPGR019

Lineární algebra - I. část (vektory, matice a jejich využití)

UJO Framework. revoluční architektura beans. verze

Programovatelné shadery a jazyk Cg. Petr Kmoch

Algoritmizace a programování

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

Šablony, kontejnery a iterátory

IRAE 07/08 Přednáška č. 1

15. Projekt Kalkulačka

Paměť počítače. alg2 1

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

27. listopadu 2013, Brno Připravil: David Procházka

Spojové struktury. Spojová struktura (linked structure):

Vybrané kapitoly z matematiky

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Seminář Java II p.1/43

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Deformace rastrových obrázků

VZOROVÝ TEST PRO 3. ROČNÍK (3. A, 5. C)

X37SGS Signály a systémy

INTERNETOVÉ ZKOUŠKY NANEČISTO - VŠE: UKÁZKOVÁ PRÁCE

Matice. Předpokládejme, že A = (a ij ) je matice typu m n: diagonálou jsou rovny nule.

První kapitola úvod do problematiky

Přerušovací systém s prioritním řetězem

Zpráva s popisem softwarového návrhu a specifikací rozhraní prototypového modulu pro odhad chyby a zjemnění sítě

Jazyk C# (seminář 9)

Derivace funkcí více proměnných

Transkript:

Android OpenGL Pokročilé shadery

Struktura programu Reálná aplikace zpravidla obsahuje více než jeden shader Kód pro inicializaci shaderu je dobré mít ve třídě (méně opisování stejného kódu) Shadery není praktické mít ve stringu tak, jak to bylo v předchozích tutorialech Lze použít resource

Základní třída Shader Obsahuje handle na OpenGL objekty public class Shader { int[] p_shader = new int[2]; // vertex a fragment shadery int n_program_object; // program object (shader handle) Znovupoužitelná funkce pro kompilaci protected void Compile(String vertexshadersrc, String fragmentshadersrc); Znovupoužitelná funkce pro linkování protected void Link(); Funkce pro aktivaci shaderu public void Use(); }

Základní třída Shader Funkce pro kompilaci vytvoří i program object a připojí k němu shadery Kompilace a linkování je oddělené Před linkováním se nastavují propojení vertex atributů s proměnnými vertex shaderu Funkce pro aktivaci shaderu Zděděné třídy ji v případě potřeby přepíšou, aby obsahovala kód pro nastavení uniformů

Shadery v resource Lze vytvořit novou sekci, kam jednotlivé shadery uložit Nevýhodou je výskyt náhodných znaků na začátku shaderu (Android bug) Všechny shadery naštěstí začínají stejně precision highp float;

Shadery v resource K základní třídě shader přidáme funkce public static String ReadResourceFile(Context ctx, int resourceid); // přečte textový soubor resourceid z resource sekce aplikace ctx public static String MakeSafeShader(String src); // odstraní ze shaderu náhodné znaky na začátku // (zdrojový kód musí začínat klíčovým slovem precision ) protected void Compile(Context ctx, int vertexshaderresourceid, int fragmentshaderresourceid); // jen volá ReadResourceFile() a zkompiluje přečtené shadery // pomocí již existující funkce stejného jména

Použití třídy Shader Zdědíme třídu Shader public class TextureShader extends Shader { Dodáme členské proměnné pro adresy uniformů int n_modelview_projection_uniform_location; // MVP uniform

Použití třídy Shader Napíšeme konstruktor public TextureShader(Context ctx) { Compile(ctx, R.raw.texturecube_vertex, R.raw.texturecube_fragment); // kompiluje shadery glbindattriblocation(n_program_object, 0, "v_pos"); glbindattriblocation(n_program_object, 1, "v_tex"); // nastaví vertex attributy (musí se udělat před linkováním) Link(); // slinkuje program n_modelview_projection_uniform_location = glgetuniformlocation(n_program_object, "t_mvp"); // zjistí kde leží parametr modelview-projection matice

Použití třídy Shader Konstruktor (pokračování) int n_tex_uni = glgetuniformlocation(n_program_object, "n_texture"); // zjistí kde leží parametr nastavení texturovací jednotky gluseprogram(n_program_object); // nastaví program jako aktivní } gluniform1i(n_tex_uni, 0); // nastaví texturovací jednotku na nulu // (to už nebude třeba v budoucnu měnit)

Použití třídy Shader Přepíšeme funkci Use() pokud je třeba Zejména pokud je třeba nastavovat uniformy public void Use(float[] modelviewprojectionmatrix) { gluseprogram(n_program_object); // nastaví program jako aktivní } gluniformmatrix4fv(n_modelview_projection_uniform_location, 1, false, modelviewprojectionmatrix, 0); // nastaví matici

Použití třídy Shader V kódu již jen vytvoříme shader (až ve chvíli kdy bylo inicializováno OpenGL, např. v onsurfacecreated()) Při kreslení jen zavoláme Use()

Blinn-Phong Shader Jednoduchý osvětlovací model ( ) L + V I = ia + id N L + is V L + V α L L+V N N je normála povrchu V je směr k pozorovateli L je směr ke světlu L+V je tzv. half vector, aproximace odrazu V α ovlivňuje velikost tzv. hot spotu ( prasátko ) V

Blinn-Phong Shader Vektory připravíme ve vertex shaderu Normálu můžeme u jednoduchých tvarů určit z pozice (u jednotkové koule je rovna pozici) Nebo může být uložená v datech vrcholů Musíme ji transformovat tzv. normálovou maticí Normálová matice je 3x3 podmatice inverzní transponované modelview matice

Blinn-Phong Shader Součinem modelview matice s pozicí spočíntáme pozici p v prostoru oka Směr k pozorovateli V = -p Směr ke světlu L = p light - p p light je pozice světla v prostoru oka spočítá se vynásobením world-space pozice světla maticí objektu (pokud to neuděláme, světlo se pohybuje s kamerou což ale může být cílem)

Blinn-Phong Shader Ve fragment shaderu již jen interpolované vektory N, L a V normalizujeme a dosadíme Složky světla můžeme rozdělit na difůzní (matné) a spekulární (lesklé oblasti) Pro jednotlivé složky můžeme mít různé textury (viz. example) difůzní spekulární

Blinn-Phong Shader

Procedurální textury Shadery mají k dispozici množství matematických funkcí, pomocí niž lze generovat procedurální textury Procedurální textury mohou být rychlejší než klasické textury Příkladem jednoduché procedurální textury je šachovnice Ještě jednodušší jsou pruhy (1D verze)

Procedurální pruhy Souřadnice s Modulo mod(s,.2) Krok step(.1, mod(s,.2))

Procedurální šachovnice a = step(.1, mod(s,.2)) b = step(.1, mod(t,.2)) ab a + b a - b

Procedurální šachovnice

Pokročilé procedurální textury Šachovnice a pruhy lze různě kombinovat Místo diskrétního step() lze použít abs() nebo smoothstep k vytvoření efektu záře Pomocí sin(), cos() a podobných lze v procedurální textuře kreslit animace

Pokročilé procedurální textury

Pong shader Pruhy se dají kreslit pomocí funkce step(velikost / 2, abs(t střed)) s y s x v y v x

Pong shader Svit (glow) se kreslí jako max(0, velikost / 2 abs(t střed)) / (velikost / 2) Pyramidová funkce s y s x v y 1 v x v x v y

Pong shader Pohyb míčku po pilovité funkci x = 2 * abs(x floor(x + 0.5)) Jiná perioda horizontálně a jiná vertikálně Hráči se pohybují s míčkem, pokud je míček daleko, rozkmitají se navíc po sinusovce sin(t)

Konec