Android OpenGL. Práce s texturami

Podobné dokumenty
Android OpenGL. Pokročilé shadery

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

Programování shaderů GLSL

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

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

Připravil: David Procházka. Shadery

NPGR019. Geometry & tessellation shaders. MFF UK Praha. Vykreslování v OpenGL Tessellation shaders Geometry shaders Literatura

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

Textury. Petr Felkel, Jaroslav Sloup a Vlastimil Havran

Textury. Petr Felkel, Jaroslav Sloup a Vlastimil Havran

Android OpenGL. Vykreslování terénu

Helios RED a Internetový obchod

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

Základy programování shaderů v OpenGL Část 2 - přenos dat

Algoritmizace a programování

Základy programování shaderů v OpenGL Část 2 - přenos dat

Reflections, refractions, interreflections

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Konstruktory a destruktory

Výčtový typ strana 67

13 Barvy a úpravy rastrového

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

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Teoretické minimum z PJV

43 HTML šablony. Záložka Šablony v systému

Program pro flexibilní tvorbu evidencí. VIKLAN - Evidence. Uživatelská příručka. pro seznámení se základními možnostmi programu

Soubor jako posloupnost bytů

ak. rok 2013/2014 Michal Španěl,

Příručka pro editaci kontaktů na eagri

9 Úprava maker Příklad 4 Word 2007/ VBA

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

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

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

Algoritmizace a programování

Úvod do programovacích jazyků (Java)

[1] samoopravné kódy: terminologie, princip

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

Ošetřování chyb v programech

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

Programovatelné shadery a jazyk Cg. Petr Kmoch

Z. Kotala, P. Toman: Java ( Obsah )

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

JSR tutorial 1 Úvod do JSR-184

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

4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

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

Java - výjimky. private void vstup() throws IOException {... }

STŘEDOŠKOLSKÁ ODBORNÁ ČINNOST

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

MS SQL Server 2008 Management Studio Tutoriál

Programování v Javě I. Leden 2008

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

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

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Operační systémy. Jednoduché stránkování. Virtuální paměť. Příklad: jednoduché stránkování. Virtuální paměť se stránkování. Memory Management Unit

Přehled vhodných metod georeferencování starých map

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ

KTE / ZPE Informační technologie

Úvod do programovacích jazyků (Java)

KTE / ZPE Informační technologie

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Př. další použití pointerů

BI-EP1 Efektivní programování 1

Úvodem... 9 Kapitola 1 Karetních

Základy programovaní 3 - Java. Unit testy. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. 26.,27.

JSR tutorial 2 Transformace v JSR-184

zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

HDR obraz (High Dynamic Range)

2D transformací. červen Odvození transformačního klíče vybraných 2D transformací Metody vyrovnání... 2

Java Výjimky Java, zimní semestr

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace a programování

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

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

Souřadnicové systémy a stanovení magnetického severu. Luděk Krtička, Jan Langr

Proměnné a datové typy

Pracovní kalendáře v systému INFOwin

Návod na import měřených dat ("zápisníku") GROMA

VOZIDLA. Uživatelská příručka SeeMe - Ecofleet. Provozovatel GPS služeb: pobočka ZNOJMO pobočka JIHLAVA pobočka DOMAŽLICE pobočka PRAHA Identifikace

Algoritmizace a programování. Terminálový vstup a výstup

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

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Projekt OPVK - CZ.1.07/1.1.00/ Matematika pro všechny. Univerzita Palackého v Olomouci

Filip Hroch. Astronomické pozorování. Filip Hroch. Výpočet polohy planety. Drahové elementy. Soustava souřadnic. Pohyb po elipse

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Textury v real-time grafice Josef Pelikán, MFF UK Praha Josef.Pelikan@mff.cuni.cz

Modul IRZ návod k použití

Systém souborů Mgr. Josef Horálek

VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

Dynamicky vázané metody. Pozdní vazba, virtuální metody

SkiJo podpora pro vytyčování, řez terénem a kreslení situací

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

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

1. Téma 12 - Textové soubory a výjimky

III. Diferenciál funkce a tečná rovina 8. Diferenciál funkce. Přírůstek funkce. a = (x 0, y 0 ), h = (h 1, h 2 ).

SPIRIT Nové funkce. SOFTconsult spol. s r. o., Praha

Transkript:

Android OpenGL Práce s texturami

Textura Obrázek, který jsme schopní nanášet na 3D objekty S použitím shaderů mnohem víc než to Může obsahovat jiné vlastnosti povrchu, než jen barvu (reliéf, lesklost, ) Může obsahovat libovolná data (tabulku hodnot funkce, atp.) Může obsahovat informace o vzdálenostech ve scéně (pro výpočet stínů)

Aplikace textury Abychom mohli texturu na povrch nanášet, potřebujeme znát její souřadnice Typicky uložené ve vrcholech Někdy je možné vypočíst souřadnice textury z pozice vrcholů v prostoru (např. mapování do plochy)

Aplikace textury Fragment shader provádí čtení textury Libovolný počet vzorků Z libovolných souřadnic Používají se tzv. samplery Udává v které texturovací jednotce je připojená textura, kterou má shader číst Většinou stačí přiřadit jednotky od nuly

Uložení textury v aplikaci Pokud se jedná o malou texturu, lze ji uložit jako statické pole přímo v kódu byte[] texture = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff} Většinou nepraktické

Uložení textury v aplikaci Je možné použít resource Identifikace podle cesty R.drawable.fitlogo

Načtení textury z resource Pomocí InputStream a BitmapFactory Bitmap bitmap; // načítaný obrázek InputStream is = mcontext.getresources getresources(). openrawresource(r.drawable.fitlogo); // identifikace resource try { bitmap = BitmapFactory.decodeStream decodestream(is); } finally { try { is.close close(); } catch (IOException e) { // chyba } }

Vytvoření textury v OpenGL int n_texture; int[] p_temp = new int[1]; glgentextures(1, p_temp, 0); n_texture = p_temp[0]; // vygeneruje texturu glbindtexture(gl_texture_2d, n_texture); gltexparameterf(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); gltexparameterf(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // nastaví texturu (lineární filtr, mip-mapping) GLUtils.texImage2D teximage2d(gl_texture_2d, 0, bitmap, 0); // glteximage2d glgeneratemipmap(gl_texture_2d); // specifikuje obrázek textury, vygeneruje mip-mapy bitmap.recycle recycle(); // úklid

Použití textury ve fragment shaderu Je třeba mít sampler Je třeba znát souřadnice precision highp float; // specifikace přesnosti varying vec2 v_texcoord; // souřadnice textury (z vertex shaderu) uniform sampler2d n_sampler; // nastaveni texturovaci jednotky void main() { gl_fragcolor = texture2d(n_sampler, v_texcoord); // přečte barvu z textury, pomocí sampleru z daných souřadnic }

Nastavení sampleru Zjistit adresu parametru sampleru int n_sampler_address = glgetuniformlocation(n_program_object, "n_sampler"); Nastavit jeho hodnotu gluseprogram(n_program_object); // aby šly nastavovat parametry gluniform1i(n_sampler_address, 0); Dát texturu do stejné texturovací jednotky glactivetexture(gl_texture0); // aktivuj texturovací jednotku 0 glbindtexture(gl_texture_2d, n_texture); // aktivuj texturu

Souřadnice textury Lze vygenerovat ve vertex shaderu precision highp float; // specifikace přesnosti attribute vec3 v_pos; // 3D pozice - vstup z dat vrcholu varying vec2 v_texcoord; // výstup 2D souřadnice textury uniform mat4 t_modelview_projection; // transformační matice void main() { gl_position = t_modelview_projection * vec4(v_pos, 1.0); // musíme zapsat pozici v_texcoord = vec2(v_pos.x, v_pos.z) * 0.5 + 0.5; // vymyslíme souřadnice textury pro fragment shader }

Souřadnice textury Generování souřadnic ve vertex shaderu však není vždy to pravéřešení (výstup z předchozích shaderů, použití souřadnic x a z jako souřadnic textury)

Souřadnice textury Pro správné mapování je třeba dodat souřadnice textury spolu s vrcholy final float[] p_box_vertices = { 1, 0, -1, 1, -1, 0, 0, 1, 1, -1, 1, 1, -1, -1, -1, 0, 1, 1, -1, -1, souřadnice v prostoru (offset v poli 2) souřadnice textury (offset v poli 0) /* a data pro další stěny... */};

Souřadnice textury Aby se souřadnice textury dostaly k shaderu, je třeba přidat druhý vertex atribut glvertexattribpointer(0, 3, // nultý atribut je 3D (pozice) GL_FLOAT, false, 5 * 4, // jeden vertex zabírá 5 * 4 byte // (5 = 3D pozice + 2D textura) p_box_vertices_buff.position position(2)); // k datům pozic je třeba // přeskočít dvě čísla glvertexattribpointer(1, 2, // první atribut je 2D (textura) GL_FLOAT, false, 5 * 4, p_box_vertices_buff.position position(0)); // data textury na začátku glenablevertexattribarray(0); glenablevertexattribarray(1); // je třeba povolit i první atribut

Souřadnice textury Je třeba upravit vertex shader precision highp float; // specifikace přesnosti attribute vec3 v_pos; attribute vec2 v_tex; // nový atribut 2D souřadnice textury varying vec2 v_texcoord; // výstup - souřadnice textury uniform mat4 t_modelview_projection; // transformační matice void main() { gl_position = t_modelview_projection * vec4(v_pos, 1.0); //.. } v_texcoord = v_tex; // zkopírujeme souřadnici textury pro fragment shader

Souřadnice textury Je třeba nastavit spojení prvního atributu s proměnnou v_tex v shaderu glbindattriblocation(n_program_object, 0, "v_pos"); // atribut pozice glbindattriblocation(n_program_object, 1, "v_tex"); // atribut souřadnice textury

Výsledek

Shrnutí Pro zobrazení textury Je třeba mít souřadnice Generování ve vertex shaderu Uložené v datech vrcholů, spolu se správným nastavením vertex atributů Je třeba mít sampler Nastavit číslo sampleru Dát texturu do stejné texturovací jednotky, nebo použít jednotku 0 (default)

Konec