ANDROID. OpenGL ES 1.0. Tomasz Dzieniak



Podobne dokumenty
grafika 2D i animacja obsługa rotacji i elementy 3D-OpenGL w Androidzie

Grafika trójwymiarowa

9. Rysowanie, animacje i podstawy grafiki 3D

Programowanie Urządzeń Mobilnych. Laboratorium nr 11, 12

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Podstawowe elementy GUI - zadania

Android pierwsza aplikacja

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Wysokopoziomowy silnik gier dla urządzeń mobilnych z systemem Android

Fragmenty są wspierane od Androida 1.6

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout

Systemy operacyjne na platformach mobilnych

Laboratorium Systemów Mobilnych. Wykład 1

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Tworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski

Mobilne aplikacje multimedialne

Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Systemy operacyjne na platformach mobilnych

Wprowadzenie do laboratorium. Zasady obowiązujące na zajęciach. Wprowadzenie do narzędzi wykorzystywanych podczas laboratorium.

Mariusz Fraś. Instytut Informatyki. olitechnika Wrocławska. Systemy Wbudowane. Android. Dr inż. Mariusz Fraś. maf 1

akademia androida Http i AsyncTask część VII

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusz Mikoda

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Obsługa SMS i telefonii

akademia androida Sensory część V Mobile Applications Developers

Plan wykładu. Akcelerator 3D Potok graficzny

AndroidManifest.xml. Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty.

Enkapsulacja, dziedziczenie, polimorfizm

Akademia ETI. Wprowadzenie do programowania w Javie PG Java User Group Przemysław Kulesza

Języki i metody programowania Java Lab2 podejście obiektowe

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

Wykorzystanie map i geolokalizacji

Mechanizm powiadomień

Programowanie Procesorów Graficznych

[Android] Podstawy programowania

Podstawowe elementy GUI - zadania

Dlaczego Android? Uczę się Javy więc piszę.. w Androidzie. Nie mam telefonu z Androidem!

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

Mobilne Aplikacje Multimedialne

Powiadomienia w systemie Android

Języki i metody programowania Java. Wykład 2 (część 2)

Tworzenie aplikacji w języku Java

OpenGL przezroczystość

Temat: Transformacje 3D

Systemy operacyjne na platformach mobilnych

Aplikacje w środowisku Java

Mechanizm zapisu preferencji

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

2. Składnia, środowisko i konwencje w Javie

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Tworzenie i wykorzystanie usług

Programowanie w Javie

Android. Zarz dzanie cyklem»ycia i stanem. Piotr Fulma«ski. March 10, 2015

Programowanie Urządzeń Mobilnych. Laboratorium nr 9,10

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

STWORZENIE PRZYKŁADOWEJ

Systemy operacyjne na platformach mobilnych

Programowanie obiektowe

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Programowanie w Internecie. Java

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Języki programowania imperatywnego

Programowanie obiektowe

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie aplikacji dla technologii mobilnych. mgr inż. Anton Smoliński

Programowanie obiektowe

Programowanie obiektowe

Db4o obiektowa baza danych wersja.net

Laboratorium Systemów Mobilnych. Wykład 2

Janusz Ganczarski. OpenGL Pierwszy program

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

PHP 5 język obiektowy

Java Platform Micro Edition

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Dokumentacja do API Javy.

Programowanie obiektowe

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Programowanie obiektowe

Zaawansowane programowanie w języku C++ Klasy w C++

Wykład 7: Pakiety i Interfejsy

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Automatyczne testowanie aplikacji Android

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Wsparcie dla różnych urządzeń. SDK pozwala przystosować aplikację do większości tych wypadków

Technologie internetowe w programowaniu.

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Ustawienia materiałów i tekstur w programie KD Max. MTPARTNER S.C.

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Wprowadzenie do systemu Android

LABORATORIUM 7 Cel: 1_1

Transkrypt:

ANDROID OpenGL ES 1.0 Tomasz Dzieniak

Wymagania JRE & JDK 5.0 + IDE (Eclipse 3.3.1 + / Netbeans 7.0.0 +) Android SDK Starter Package Android SDK Components

Pierwszy program Project name: OpenGL Build Target: Android 2.0 Application name: OpenGL Package name: org.umk.opengl Create Activity: OpenGL Min SDK Version: 8

OpenGL/src/org/umk/opengl/OpenGL.java package org.umk.opengl; import android.app.activity; import android.os.bundle; public class OpenGL extends Activity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main);

OpenGL/src/org/umk/opengl/OpenGL.java package org.umk.opengl; import android.app.activity; import android.os.bundle; public class OpenGL extends Activity { WidokGL widok; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); widok = new WidokGL(this); setcontentview(r.layout.main); @Override protected void onpause() { super.onpause(); widok.onpause(); Przesłaniamy metody odpowiedzialne za pauzowanie i kontynuowanie zdarzeń. Będą wywoływać swoje odpowiedniki na rzecz wystąpienia obiektu klasy WidokGL. @Override protected void onresume() { super.onresume(); widok.onresume();

OpenGL/src/org/umk/opengl/WidokGL.java package org.umk.opengl; import android.content.context; import android.opengl.glsurfaceview; class WidokGL extends GLSurfaceView { WidokGL(Context kontekst) { super(kontekst); setrenderer(renderer);

OpenGL/src/org/umk/opengl/WidokGL.java package org.umk.opengl; import android.content.context; import android.opengl.glsurfaceview; class WidokGL extends GLSurfaceView { private final RendererGL renderer; WidokGL(Context kontekst) { super(kontekst); Tworzymy instancję klasy WidokGL, która będzie odpowiedzialna za wykonywanie całej pracy: konfigurację frustum rysowanie aktora animację aktora oświetlanie sceny teksturowanie przezroczystość renderer = new RendererGL(kontekst); setrenderer(renderer);

OpenGL/src/org/umk/opengl/RendererGL.java package org.umk.opengl; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.content.context; import android.opengl.glsurfaceview; import android.opengl.glu; class RendererGL implements GLSurfaceView.Renderer { private final Context kontekst; RendererGL(Context kontekst) { this.kontekst = kontekst;

OpenGL/src/org/umk/opengl/RendererGL.java package org.umk.opengl; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.content.context; import android.opengl.glsurfaceview; import android.opengl.glu; class RendererGL implements GLSurfaceView.Renderer { private final Context kontekst; Przeciążamy metody odpowiedzialne za tworzenie ramki, jej odświeżanie i wyświetlanie. RendererGL(Context kontekst) { this.kontekst = kontekst; public void onsurfacecreated(gl10 gl, EGLConfig konfig) { //... public void onsurfacechanged(gl10 gl, int szerokosc, int wysokosc) { //... public void ondrawframe(gl10 gl) { //...

OpenGL/src/org/umk/opengl/RendererGL.java public void onsurfacecreated(gl10 gl, EGLConfig konfig) { gl.glenable(gl10.gl_depth_test); gl.gldepthfunc(gl10.gl_lequal); gl.glenableclientstate(gl10.gl_vertex_array); GL_DEPTH_TEST porównanie głębi i aktualizacja bufora głębokości GL_LEQUAL określa, które piksee bufor Z ma zignorować, a które wyświetlić na ekranie GL_VERTEX_ARRAY uruchamia vertex array

OpenGL/src/org/umk/opengl/RendererGL.java public void onsurfacechanged(gl10 gl, int szerokosc, int wysokosc) { gl.glviewport(0, 0, szerokosc, wysokosc); gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); float proporcje = (float) szerokosc / wysokosc; GLU.gluPerspective(gl, 45.0f, proporcje, 1, 100f); ustawiamy ostrosłup widzenia uruchamiamy macierz modelu resetujemy macierz modelowania określamy perspektywę i parametry wyświetlania obrazu kąt widzenia proporcje obrazu bliższą płaszczyznę ograniczającą dalszą płaszczyznę ograniczającą

Pierwszy rzut oka

OpenGL/src/org/umk/opengl/RendererGL.java public void ondrawframe(gl10 gl) { gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); gl.glmatrixmode(gl10.gl_modelview); gl.glloadidentity(); gl.gltranslatef(0, 0, -3.0f); oczyszczamy bufor głębi i bufor koloru resetujemy macierz modelowania przesuwamy obraz tak, aby coś zobaczyć

OpenGL/src/org/umk/opengl/SzescianGL.java package org.umk.opengl; import java.nio.bytebuffer; import java.nio.byteorder; import java.nio.intbuffer; import javax.microedition.khronos.opengles.gl10; class SzescianGL { private final IntBuffer mbuforwierzcholka; public SzescianGL() { int jeden = 65536; int pol = jeden / 2; int[] wierzcholki = { // ściana przednia -pol, -pol, pol, pol, -pol, pol, -pol, pol, pol, pol, pol, pol, // ściana tylnia -pol, -pol, -pol, -pol, pol, -pol, pol, -pol, -pol, pol, pol, -pol, // ściana lewa -pol, -pol, pol, -pol, pol, pol, -pol, -pol, -pol, -pol, pol, -pol, ; // ściana prawa pol, -pol, -pol, pol, pol, -pol, pol, -pol, pol, pol, pol, pol, // szczyt -pol, pol, pol, pol, pol, pol, -pol, pol, -pol, pol, pol, -pol, // spód -pol, -pol, pol, -pol, -pol, -pol, pol, -pol, pol, pol, -pol, -pol, ByteBuffer vbb = ByteBuffer.allocateDirect( wierzcholki.length * 4); vbb.order(byteorder.nativeorder()); mbuforwierzcholka = vbb.asintbuffer(); mbuforwierzcholka.put(wierzcholki); mbuforwierzcholka.position(0);

OpenGL/src/org/umk/opengl/SzescianGL.java CDN public void rysuj(gl10 gl) { gl.glvertexpointer(3, GL10.GL_FIXED, 0, mbuforwierzcholka); gl.glcolor4f(1, 1, 1, 1); gl.glnormal3f(0, 0, 1); gl.gldrawarrays(gl10.gl_triangle_strip, 0, 4); gl.glnormal3f(0, 0, -1); gl.gldrawarrays(gl10.gl_triangle_strip, 4, 4); gl.glcolor4f(1, 1, 1, 1); gl.glnormal3f(-1, 0, 0); gl.gldrawarrays(gl10.gl_triangle_strip, 8, 4); gl.glnormal3f(1, 0, 0); gl.gldrawarrays(gl10.gl_triangle_strip, 12, 4); gl.glcolor4f(1, 1, 1, 1); gl.glnormal3f(0, 1, 0); gl.gldrawarrays(gl10.gl_triangle_strip, 16, 4); gl.glnormal3f(0, -1, 0); gl.gldrawarrays(gl10.gl_triangle_strip, 20, 4);

OpenGL/src/org/umk/opengl/RendererGL.java // aktor private final SzescianGL szescian = new SzescianGL(); public void ondrawframe(gl10 gl) { ( ) szescian.rysuj(gl); tworzymy instancję klasy SzescianGL (tworzymy aktora) w metodzie ondrawframe wywołujemy funkcję rysującą

Gotowy sześcian

OpenGL/src/org/umk/opengl/RendererGL.java // poniżej oświetlenie float[] oswietleniedookolne = new float[] { 0.2f, 0.2f, 0.2f, 1 ; float[] oswietlenierozproszone = new float[] { 1, 1, 1, 1 ; float[] pozostalezrodlaswiatla = new float[] { 1, 1, 1, 1 ; gl.glenable(gl10.gl_lighting); gl.glenable(gl10.gl_light0); gl.gllightfv(gl10.gl_light0, GL10.GL_AMBIENT, oswietleniedookolne, 0); gl.gllightfv(gl10.gl_light0, GL10.GL_DIFFUSE, oswietlenierozproszone, 0); gl.gllightfv(gl10.gl_light0, GL10.GL_POSITION, pozostalezrodlaswiatla, 0); // symulacja materiału float[] materialdookolne = new float[] { 1, 1, 1, 1 ; float[] materialrozproszone = new float[] { 1, 1, 1, 1 ; gl.glmaterialfv(gl10.gl_front_and_back, GL10.GL_AMBIENT, materialdookolne, 0); gl.glmaterialfv(gl10.gl_front_and_back, GL10.GL_DIFFUSE, materialrozproszone, 0); konfigurujemy parametry światła i materiału położenie światła i kolor Tworzone światło (w położeniu (1,1,1) jest nieukierunkowane, posiada składową światła dookolnego i rozproszonego. Materiał zostaje określony jako matowy (podobny do papieru). W efekcie prawy górny róg sześcianu, który znajduje się bliżej źródła światła będzie jaśniejszy.

OpenGL/src/org/umk/opengl/RendererGL.java // animacja klasa RendererGL private long czasstartu; // animacja metoda onsurfacecreate czasstartu = System.currentTimeMillis(); // animacja metoda ondrawframe -> long szacowany = System.currentTimeMillis() - czasstartu; gl.glrotatef(szacowany * (30f / 1000f), 0, 1, 0); gl.glrotatef(szacowany * (15f / 1000f), 1, 0, 0); // <- animacja Dodanie powyższych fragmentów kodu spowoduje ładną, płynną animację sześcianu (obrót o 30 stopni wzdłuż osi x i 15 stopni wzdłuż osi y). Uwaga: emulowanie programu może powodować zmniejszenie wydajności wyświetlanej animacji. Na urządzeniu płynność jest płynniejsza ;)

OpenGL/src/org/umk/opengl/SzescianGL.java // tekstura private final IntBuffer mbufortekstury; ; // tekstura int[] wspolrzednetekstury = { // ściana przednia 0, jeden, jeden, jeden, 0, 0, jeden, 0, // ściana tylnia jeden, jeden, jeden, 0, 0, jeden, 0, 0, // ściana lewa jeden, jeden, jeden, 0, 0, jeden, 0, 0, // ściana prawa jeden, jeden, jeden, 0, 0, jeden, 0, 0, // szczyt jeden, 0, 0, 0, jeden, jeden, 0, jeden, // spód 0, 0, 0, jeden, jeden, 0, jeden, jeden, ByteBuffer tbb = ByteBuffer.allocateDirect(wspolrzedneTekstury.length * 4); tbb.order(byteorder.nativeorder()); mbufortekstury = tbb.asintbuffer(); mbufortekstury.put(wspolrzednetekstury); mbufortekstury.position(0); Powyższy kod należy umieścić w konstruktorze.

OpenGL/src/org/umk/opengl/SzescianGL.java CDN static void wczytajteksture(gl10 gl, Context kontekst, int zasob) { Bitmap bmp = BitmapFactory.decodeResource( kontekst.getresources(), zasob); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); Poniższy kod należy umieścić w metodzie rysuj. // tekstura -> gl.glenable(gl10.gl_texture_2d); gl.gltexcoordpointer(2, GL10.GL_FIXED, 0, mbufortekstury); // <- tekstura Na koniec w klasie RendererGL w metodzie onsurfacecreated wymuszamy obsługę tekstur. // tekstura gl.glenableclientstate(gl10.gl_texture_coord_array); gl.glenable(gl10.gl_texture_2d);

Efekt końcowy

Przezroczystość

Pytania?

Pytania?