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

Podobne dokumenty
Grafika trójwymiarowa

9. Rysowanie, animacje i podstawy grafiki 3D

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

ANDROID. OpenGL ES 1.0. Tomasz Dzieniak

3 Przygotował: mgr inż. Maciej Lasota

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

Zatem standardowe rysowanie prymitywów wygląda następująco:

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 6

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

2 Przygotował: mgr inż. Maciej Lasota

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

Rzutowanie DOROTA SMORAWA

Zaawansowany kurs języka Python

Janusz Ganczarski. OpenGL Pierwszy program

Mobilne aplikacje multimedialne. OpenGL

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

Wprowadzenie do QT OpenGL

Janusz Ganczarski. OpenGL Definiowanie sceny 3D

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

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

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Temat: Transformacje 3D

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Programowanie telefonów z Windows Phone 7, cz. 3

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Java: interfejsy i klasy wewnętrzne

Podstawowe elementy GUI - zadania

8 Przygotował: mgr inż. Maciej Lasota

GRAFIKA CZASU RZECZYWISTEGO Podstawy syntezy grafiki 3D i transformacji geometrycznych

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

Podstawy Processingu. Diana Domańska. Uniwersytet Śląski

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Plan wykładu. Akcelerator 3D Potok graficzny

MonoGame. Wieloplatformowe gry w C# Mateusz Cicheński

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

Temat: Wprowadzenie do OpenGL i GLUT

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Grafika 3D OpenGL część II

Wykład 4. Rendering (1) Informacje podstawowe

Programowanie Procesorów Graficznych

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

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Programowanie obiektowe

Wstęp do JUNG. Omówione elementy wykorzystane w Edge Color Project

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

Co to jest OpenGL? Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5. OpenGL - Achitektura. OpenGL - zalety. olas@icis.pcz.

Fragmenty są wspierane od Androida 1.6

Wykład 7: Pakiety i Interfejsy

Android pierwsza aplikacja

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

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

JAVA W SUPER EXPRESOWEJ PIGUŁCE

GRAFIKA CZASU RZECZYWISTEGO Wstęp do programowania grafiki czasu rzeczywistego.

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

akademia androida Sensory część V Mobile Applications Developers

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Wprowadzenie. Artur Staszczyk Bartłomiej Filipek

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

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Enkapsulacja, dziedziczenie, polimorfizm

Systemy operacyjne na platformach mobilnych

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Mobilne Aplikacje Multimedialne

1. Prymitywy graficzne

Animowana grafika 3D. Opracowanie: J. Kęsik.

Szybkie tworzenie grafiki w GcIde

Technologie i usługi internetowe cz. 2

Rysowanie. Rysowanie - podstawy

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

Grafika Komputerowa, Informatyka, I Rok

Gry Komputerowe Laboratorium 1. Zajęcia organizacyjne Animacja z uwzględnieniem czasu. mgr inż. Michał Chwesiuk 1/22. Szczecin,

Programowanie obiektowe i zdarzeniowe

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

PyGame Gra w Ponga. Spis treści

OpenGL - Open Graphics Library. Programowanie grafiki komputerowej. OpenGL 3.0. OpenGL - Architektura (1)

OpenGL przezroczystość

Bartosz Bazyluk Wprowadzenie Organizacja i tematyka zajęć, warunki zaliczenia.

Podstawy Programowania Obiektowego

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 5

Grafika komputerowa i wizualizacja. dr Wojciech Pałubicki

Mobilne aplikacje multimedialne

OpenGL - maszyna stanu. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 7. Grupy atrybutów. Zmienne stanu.

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

1 Temat: Vertex Shader

Dokumentacja do API Javy.

Bartosz Bazyluk SYNTEZA GRAFIKI 3D Grafika realistyczna i czasu rzeczywistego. Pojęcie sceny i kamery. Grafika Komputerowa, Informatyka, I Rok

Laboratorium Systemów Mobilnych. Wykład 1

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

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

Polimorfizm. dr Jarosław Skaruz

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska

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

Programowanie obiektowe

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23

Wykład 5. Rendering (2) Geometria

Transkrypt:

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

Open GL Open GL Open Graphics Library specyfikacja uniwersalnego, wieloplatformowego API do generowania grafiki. Zestaw funkcji składa się z podstawowych wywołań, umożliwiających budowanie złożonych trójwymiarowych scen z podstawowych figur geometrycznych. OpenGL wykorzystywany jest często przez gry komputerowe i wygaszacze ekranu. Wiele programów przedstawiających wyniki badań naukowych (programy typu CAD) używa biblioteki OpenGL.

Open GL Biblioteki pomocnicze: GLU (ang. GL Utility library), GLUT (ang. GL Utility Toolkit), GLX (w przypadku środowiska X Window System), WGL (w przypadku Windows), SDL (ang. Simple DirectMedia Layer),

Open GL ES OpenGL ES OpenGL for Embedded Systems to podzbiór OpenGL 3D zaprojektowany m.in. dla urządzeń mobilnych typu telefony komórkowe, palmtopy i konsole do gier. OpenGL ES jest oficjalnym API dla grafiki 3D w systemach Symbian, Android, ios. Ważniejsze różnice do pełnej wersji OpenGL: usunięcie glbegin... glend semantyka dla prymitywów, wprowadzenie stałej długości atrybutów zmiennoprzecinkowych (przyspieszenie obliczeń) i wiele innych.

Open GL ES dla Androida OpenGL ES 1.0 wspomagany na platformie android. OpenGL ES 1.1 wprowadzony na platformie od wersji Android 1.6 OpenGL ES 2.0 wspierany na platformie Android od wersji 2.2 OpenGL ES 2.0 wspierany w bibliotece NDK od wersji Android 2.0 OpenGL ES 3.0 wspierany w bibliotece NDK od wersji Android 4.3

Open GL ES - składowe void glvertexpointer (int size, int type, int stride, Buffer pointer) służy do określenia zbioru (tablicy) punktów (wierzchołków) dla elementów rysowanych w kontekście graficznym. size liczba współrzędnych wierzchołka, type typ przekazywanej wartości, stride przestrzeń pomiędzy wartościami (elementy pomijane), pointer bufor (tabela) danych.

Open GL ES - składowe void gldrawelements (int mode, int count, int type, Buffer indices) uruchomienie procedury rysowania prymitywów (elementów graficznych) według podanych parametrów oraz wczytanych wierzchołków: mode rodzaj rysowanego kształtu, count liczba indeksów (wierzchołków), type typ danych dla indeksów, indices bufor zawierający indeksy wierzchołków.

Open GL ES - składowe Rodzaj rysowanego kształtu (mode): GL_POINTS lista punktów, GL_LINES lista linii (odcinków), GL_LINE_STRIP wstęga odcinków (łamana), GL_LINE_LOOP zamknięta wstęga odcinków, GL_TRIANGLES lista trójkątów, GL_TRIANGLE_STRIP wstęga trójkątów, GL_TRIANGLE_FAN wachlarz trójkątów, GL_QUADS czworościany, GL_QUAD_STRIP wstęga czworościanów, GL_POLYGON wielokąt.

Open GL ES - składowe

Open GL ES - składowe glclear(int mask) wywołanie metody powoduje wymazanie odpowiedniego bufora danych: GL_COLOR_BUFFER_BIT Bufor koloru (obrazu). Wymazanie tego bufora powoduje ustawienie domyślnego koloru, GL_DEPTH_BUFFER_BIT Bufor głębokości odpowiedzialny za badanie zakrytych obszarów rysunku, GL_STENCIL_BUFFER_BIT Bufor szablonu bufor stosowany do tworzenia obrazów z odbiciem obrazu (lustro).

Open GL ES - składowe glcolor4f(float red, float green, float blue, float alpha), glcolor4x(int red, int green, int blue, int alpha) ustawienie barwy, za pomocą której będzie narysowany prymityw. Kolor można określić wartością rzeczywistą (0.0 1.0) oraz wartością całkowitą (0 255). glcolorpointer(int size, int type, int stride, Buffer pointer) kolor może być przekazany dla każdego wierzchołka (ściany rysowanych prymitywów będą cieniowane). Wywołanie analogiczne jak w przypadku metody glvertexpointer.

Open GL ES - składowe glviewport(int x, int y, int width, int height) określenie rozmiaru okna graficznego obszaru w którym zostanie narysowany obraz. glorthof(float left, float right, float bottom, float top, float znear, float zfar) rzut prostokątny bez zastosowania perspektywy glfrustumf(float left, float right, float bottom, float top, float znear, float zfar) utworzenie tablicy projekcji (rzutowania) obrazu. gluperspective(gl10 gl, float fovy, float aspect, float znear, float zfar) ustawienie widoku perspektywy.

Open GL ES - składowe aspect = (float) w / (float) h; fovy - kąt pola widzenia w stopniach, w kierunku y.

Open GL ES - składowe glulookat(gl10 gl, float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float upx, float upy, float upz) kontroluje położenie kamery widoku. glloadidentity() zerowanie macierzy transformacji. glrotatef(float angle, float x, float y, float z) obroty wokół jednej z osi o zadany kąt. gltranslatef(float x, float y, float z) translacja (przemieszczenie) obrazu o zadany wektor.

Open GL ES ekran Kolejne etapy tworzenia kontekstu rysowania: Implementacja interfejsu Renderer, Ustawienie obiektu kamery w klasie implementującej interfejs Renderer, Implementacja procedury rysowania w metodzie ondrawframe (interfejs Renderer), Konstrukcja obiektu GLSurfaceView, Konfiguracja interfejsu renderującego GLSurfaceView,

Open GL ES przykład public class OpenGl extends Activity { private GLSurfaceView glsv; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); glsv = new GLSurfaceView(this); // Wyłączenie bufora głębokości glsv.seteglconfigchooser(false); // Ustawienie obiektu renderującego glsv.setrenderer(new SimpleTriangleRenderer(this)); // Statyczny tryb renderowania. // Przerysowanie wymaga wywołania requestrender () glsv.setrendermode( GLSurfaceView.RENDERMODE_WHEN_DIRTY); // Tryb automatcznego renderowania sceny // glsv.setrendermode( // GLSurfaceView.RENDERMODE_CONTINUOUSLY); setcontentview(glsv);

Open GL ES przykład public class OpenGl extends Activity { //......... @Override protected void onresume() { super.onresume(); glsv.onresume(); @Override protected void onpause() { super.onpause(); glsv.onpause();

Open GL ES przykład public abstract class AbstractRenderer implements Renderer { { @Override public void onsurfacecreated(gl10 gl, EGLConfig conf) gl.glclearcolor(0.5f, 0.5f, 0.5f, 0.5f); gl.glenable(gl10.gl_depth_test); @Override public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0,0,w,h); float aspect = (float) w / h; gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); gl.glfrustumf(-aspect, aspect, -1,1,3,7); gl.glmatrixmode(gl10.gl_modelview);

Open GL ES przykład public abstract class AbstractRenderer implements Renderer { @Override public void ondrawframe(gl10 gl) { gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); gl.glloadidentity(); GLU.gluLookAt(gl, 0,0,-5, 0f,0f,0f,0f,1.0f,0.0f); gl.glenableclientstate(gl10.gl_vertex_array); draw(gl); protected abstract void draw(gl10 gl);

Open GL ES przykład public class SimpleTriangleRenderer extends AbstractRenderer { private final static float [] coords = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f ; private final static short [] indexes = { 0, 1, 2 ; private final static int VERTEX = 3; // Bufor współrędnych private FloatBuffer vertex; // Bufor indeksów wierzchołków private ShortBuffer index;

Open GL ES przykład public class SimpleTriangleRenderer extends AbstractRenderer { SimpleTriangleRenderer(Context context) { ByteBuffer bb; bb = ByteBuffer.allocateDirect(VERTEX * 3 * 4); bb.order(byteorder.nativeorder()); vertex = bb.asfloatbuffer(); bb = ByteBuffer.allocateDirect(VERTEX * 3); bb.order(byteorder.nativeorder()); index = bb.asshortbuffer(); for (int i = 0; i < VERTEX; ++i { for (int j = 0; j < 3; ++j) { vertex.put(coords[i * 3 + j]);

Open GL ES przykład public class SimpleTriangleRenderer extends AbstractRenderer { SimpleTriangleRenderer(Context context) { //... for (int i = 0; i < indexes.length; ++ i) { index.put(indexes[i]); vertex.position(0); index.position(0); protected void draw(gl10 gl) { gl.glcolor4f(1.0f, 0.0f, 0.0f, 0.5f); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, vertex); gl.gldrawelements(gl10.gl_triangles, 3, GL10.GL_UNSIGNED_SHORT, index);

Open GL ES - Obsługa zdarzeń boolean ontouchevent (MotionEvent event) final class MotionEvent getaction() typ zdarzenia ACTION_DOWN, ACTION_MOVE, ACTION_UP, or ACTION_CANCEL, float getx(), float gety() współrzędne wystąpienia zdarzenia, int getpointercount (), float getx (int index), loat gety (int index) wszystkie punkty w tym zdarzeniu....

Open GL ES - Obsługa zdarzeń public class OpenGlTouch extends Activity { private GLSurfaceView mglview; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); mglview = new ClearGLSurfaceView(this); setcontentview(mglview); @Override protected void onpause() { super.onpause(); mglview.onpause(); @Override protected void onresume() { super.onresume(); mglview.onresume();

Open GL ES - Obsługa zdarzeń class ClearGLSurfaceView extends GLSurfaceView { ClearRenderer mrenderer; public ClearGLSurfaceView(Context context) { super(context); mrenderer = new ClearRenderer(); setrenderer(mrenderer); { public boolean ontouchevent(final MotionEvent event) mrenderer.setcolor(event.getx() / getwidth(), event.gety() / getheight(), 1.0f ); return true;

Open GL ES - Obsługa zdarzeń class ClearRenderer implements GLSurfaceView.Renderer { public void onsurfacecreated(gl10 gl, EGLConfig config) { public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0, 0, w, h); public void ondrawframe(gl10 gl) { gl.glclearcolor(mred, mgreen, mblue, 1.0f); gl.glclear(gl10.gl_color_buffer_bit); public void setcolor(float r, float g, float b) { mred = r; mgreen = g; mblue = b; private float mred, mgreen, mblue;

OGL Sfera OpenGLSphere public class OpenGLSphere extends Activity { private GLSurfaceView mglview; @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // Pełny ekran bez tytułu this.requestwindowfeature(window.feature_no_title); getwindow().setflags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); // Kontekst renderowania mglview = new ViewSurface(this); setcontentview(mglview); protected void onpause() { //... protected void onresume() { //...

OGL Sfera ViewSurface class ViewSurface extends GLSurfaceView { ViewRenderer mrenderer; // Punkt dotyku ekranu private float x, y, o = 0; public ViewSurface(Context context) { super(context); // Moduł renderowania obrazu mrenderer = new ViewRenderer(); setrenderer(mrenderer); SetRenderMode( GLSurfaceView.RENDERMODE_CONTINUOUSLY);

OGL Sfera ViewSurface public boolean ontouchevent(final MotionEvent event) { switch (event.getaction()) { // Zdarzenie dotknięcia ekranu case MotionEvent.ACTION_DOWN : x = event.getx(); y =event.gety(); o = 1; break; // Zdarzenie zwolnienia nacisku case MotionEvent.ACTION_UP : o = 0; break; // Zdarzenie przesunięcia po ekranie case MotionEvent.ACTION_MOVE : if (o > 0) mrenderer.rotate(y - event.gety(), x - event.getx()); x = event.getx(); y = event.gety(); break; return true;

OGL Sfera ViewRenderer class ViewRenderer implements GLSurfaceView.Renderer { // Stałe pomocnicze private final static float X = 0.525731112119133606f; private final static float Z = 0.850650808352039932f; // wierzchołki private final static float [] vdata = { -X, 0, Z, X, 0, Z, -X, 0,-Z, X, 0,-Z, 0, Z, X, 0, Z,-X, 0,-Z, X, 0,-Z,-X, Z, X, 0, -Z, X, 0, Z,-X, 0, -Z,-X, 0 ; // kolory wierzchołków private final static float [] cdata = { 1,0,0,1, 0,1,0,1, 0,0,1,1, 1,1,0,1, 1,0,1,1, 0,1,1,1, X,0,0,1, 0,X,0,1, 0,0,X,1, X,X,0,1, X,0,X,1, 0,X,X,1, ;

OGL Sfera ViewRenderer // opis powierzchni dwudziestościanu private final static short [] idata = { 0,4,1, 0,9,4, 9,5,4, 4,5,8, 4,8,1, 8,10,1, 8,3,10, 5,3,8, 5,2,3, 2,7,3, 7,10,3, 7,6,10, 7,11,6, 11,0,6, 0,1,6, 6,1,10, 9,0,11, 9,11,2, 9,2,5, 7,2,11 ; // bufory danych private FloatBuffer vertex, color; private ShortBuffer index; // liczba trójkątów do narysowania private int ni; // współczynnik rotacji obrazy private float rx = 0, ry = 0; // macierz pomocnicza rotacji private float trans[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1;

OGL Sfera ViewRenderer ViewRenderer() { // tworzenie buforów danych do renderowania vertex = ByteBuffer.allocateDirect(vdata.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); color = ByteBuffer.allocateDirect(cdata.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer(); index = ByteBuffer.allocateDirect(idata.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer(); vertex.put(vdata); color.put(cdata); index.put(idata); vertex.position(0); color.position(0); index.position(0); ni = idata.length ;

OGL Sfera ViewRenderer public void onsurfacecreated(gl10 gl, EGLConfig config) { // inicjacja kontekstu renderowania gl.glclearcolor(0.1f, 0.1f, 0.1f, 0.5f); // test głębokości gl.glenable(gl10.gl_depth_test); // rysowanie widocznych ścianek gl.glenable(gl10.gl_cull_face); gl.glfrontface(gl10.gl_ccw); gl.glcullface(gl10.gl_back);

OGL Sfera ViewRenderer public void onsurfacechanged(gl10 gl, int w, int h) { // inicjacja widoku gl.glviewport(0,0,w,h); float aspect = (float) w / (float) h; gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); // gl.glfrustumf(-aspect, aspect, -1,1,-1,1); // widok perspektywiczny GLU.gluPerspective(gl, 40.0f, aspect, -1f, 2.0f); gl.glmatrixmode(gl10.gl_modelview);

OGL Sfera ViewRenderer public void ondrawframe(gl10 gl) { // Czyszczenie buforów gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); gl.glenableclientstate(gl10.gl_vertex_array); gl.glenableclientstate(gl10.gl_color_array); // transformacje - obroty gl.glloadidentity(); float tmp[] = {1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1; Matrix.rotateM(tmp, 0, rx, 1, 0, 0); Matrix.rotateM(tmp, 0, ry, 0, 1, 0); Matrix.multiplyMM(trans, 0, tmp, 0, trans, 0); gl.glmultmatrixf(trans, 0); rx = ry = 0; // gl.glrotatef(rx, 1, 0, 0); // gl.glrotatef(ry, 0, 1, 0);

OGL Sfera ViewRenderer // rysowanie obrazy sfery gl.glvertexpointer(3, GL10.GL_FLOAT, 0, vertex); gl.glcolorpointer(4, GL10.GL_FLOAT, 0, color); gl.gldrawelements(gl10.gl_triangles, ni, GL10.GL_UNSIGNED_SHORT, index); public void rotate(float x, float y) { // zmiana obrotu rx += x; ry += y;

Open GL - Teksturowanie public class OpenGLText extends Activity { private GLSurfaceView glsv; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); glsv = new GLSurfaceView(this); // Wyłączenie bufora głębokości glsv.seteglconfigchooser(false); // Ustawienie obiektu renderującego glsv.setrenderer(new TexturedSquareRenderer(this)); // Statyczny tryb renderowania. // Przerysowanie wymaga wywołania requestrender () glsv.setrendermode(glsurfaceview.rendermode_when_dirty); setcontentview(glsv); protected void onresume() { super.onresume(); glsv.onresume(); protected void onpause() { super.onpause(); glsv.onpause();

Open GL - Teksturowanie abstract class AbstractRenderer implements Renderer { int mtextureid; int mimageresourceid; Context mcontext; public AbstractRenderer(Context ctx, int imageresourceid) { mimageresourceid = imageresourceid; mcontext = ctx; @Override public void onsurfacecreated(gl10 gl, EGLConfig conf) { gl.glclearcolor(0.5f, 0.5f, 0.5f, 0.5f); gl.glenable(gl10.gl_depth_test); preparetexture(gl);

Open GL - Teksturowanie private void preparetexture(gl10 gl) { int[] textures = new int[1]; gl.glgentextures(1, textures, 0); mtextureid = textures[0]; gl.glbindtexture(gl10.gl_texture_2d, mtextureid); gl.gltexparameterf(gl10.gl_texture_2d, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); gl.gltexparameterf(gl10.gl_texture_2d, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); gl.gltexparameterf(gl10.gl_texture_2d, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); gl.gltexparameterf(gl10.gl_texture_2d, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); gl.gltexenvf(gl10.gl_texture_env, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

Open GL - Teksturowanie InputStream is = mcontext.getresources().openrawresource(this.mimageresourceid); Bitmap bitmap; bitmap = BitmapFactory.decodeStream(is); GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); bitmap.recycle(); public void onsurfacechanged(gl10 gl, int w, int h) { gl.glviewport(0,0,w,h); float aspect = (float) w / h; gl.glmatrixmode(gl10.gl_projection); gl.glloadidentity(); gl.glfrustumf(-aspect, aspect, -1,1,3,7); gl.glmatrixmode(gl10.gl_modelview);

Open GL - Teksturowanie public void ondrawframe(gl10 gl) { gl.gldisable(gl10.gl_dither); gl.gltexenvx(gl10.gl_texture_env, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE); gl.glclear(gl10.gl_color_buffer_bit GL10.GL_DEPTH_BUFFER_BIT); gl.glmatrixmode(gl10.gl_modelview); gl.glloadidentity(); GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1.0f, 0.0f); gl.glenableclientstate(gl10.gl_vertex_array); gl.glenableclientstate(gl10.gl_texture_coord_array); gl.glactivetexture(gl10.gl_texture0); gl.glbindtexture(gl10.gl_texture_2d, mtextureid); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.gltexparameterx(gl10.gl_texture_2d, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); draw(gl); protected abstract void draw(gl10 gl);

Open GL - Teksturowanie class TexturedSquareRenderer extends AbstractRenderer { //Nieskompresowany bufor natywny, współrzędne punktów private FloatBuffer mfvertexbuffer; //Nieskompresowany bufor natywny, współrzędne tekstury private FloatBuffer mftexturebuffer; // Nieskompresowany bufor natywny, przechowujący indeksy // pozwalające na wielokrotne wykorzystywanie punktów. private ShortBuffer mindexbuffer; private int numofindices = 0; private int sides = 4; public TexturedSquareRenderer(Context context) { super(context, R.drawable.icon); preparebuffers(sides);

Open GL - Teksturowanie private void preparebuffers(int sides) { RegularPolygon t = new RegularPolygon(0,0,0,0.8f,sides); this.mfvertexbuffer = t.getvertexbuffer(); this.mftexturebuffer = t.gettexturebuffer(); this.mindexbuffer = t.getindexbuffer(); this.numofindices = t.getnumberofindices(); this.mfvertexbuffer.position(0); this.mindexbuffer.position(0); this.mftexturebuffer.position(0); protected void draw(gl10 gl) { preparebuffers(sides); gl.glenable(gl10.gl_texture_2d); gl.glvertexpointer(3, GL10.GL_FLOAT, 0, mfvertexbuffer); gl.gltexcoordpointer(2, GL10.GL_FLOAT, 0, mftexturebuffer); gl.gldrawelements(gl10.gl_triangles, this.numofindices, GL10.GL_UNSIGNED_SHORT, mindexbuffer);