2009-11-11 8 views
6

Piszę aplikacje graficzne na iPhone'a i zamierzam przenieść moją najnowszą aplikację "Layers" na platformę Android. Warstwy to aplikacja do malowania, która pozwala użytkownikom rysować na ekranie i tworzyć wielowarstwowe obrazy z różnymi pędzlami, kolorami itp. ... i eksportować do PSD. Ma synchronizację pulpitu, narzędzie do rozmazywania, mnóstwo dobrych rzeczy ... http://www.layersforiphone.com/Android OpenGLES Render-to-Texture

Zacząłem patrzeć na platformę Android w poniedziałek i natknąłem się na poważny problem. Używam OpenGL, aby wykonać cały rysunek, ponieważ zapewnia on najlepszą wydajność. Jednak istnieje kilka miejsc, w których muszę renderować teksturę, a następnie użyć tekstury. Na przykład:

  1. Korzystanie pędzlem tekstury i linii duszków stworzyć czarną farbą skok w fakturze A
  2. pędzla Put kolor + Alpha glColor4f a następnie narysować teksturowania na ekranie.

Na iPhonie robię to ciągle, gdy palec użytkownika porusza się, a ja jestem w stanie osiągnąć 12-15 fps na iPoda Touch 1. generacji. Jest to konieczne, ponieważ stosowanie koloru i alfa do poszczególnych duszków tworzących pociągnięcie pędzla nie daje właściwego rezultatu (ponieważ sprite nakładają się i powodują, że obrys jest zbyt ciemny).

platformie Android obsługuje OpenGL ES 1.0, ale wydaje się pomijać najważniejsze funkcje do czynienia z bufora ramki. Nie mogę znaleźć sposobu na powiązanie tekstury z framebufferem i narysowanie go przy użyciu OpenGL.

Oto jak bym normalnie zabrać na iPhone:

// generate a secondary framebuffer and bind it to OpenGL so we don't mess with existing output. 
glGenFramebuffers(1, &compositingFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, compositingFramebuffer); 

// attach a texture to the framebuffer. 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); 

// subsequent drawing operations are rendered into the texture 

// restore the primary framebuffer and (possibly) draw the rendered texture 
glBindFramebuffer(GL_FRAMEBUFFER, originalActiveFramebuffer); 

Czy istnieje coś takiego na platformie Android? Na iPhonie OpenGL jest znacznie szybszy niż oparty na oprogramowaniu rysunek i jest jedynym realnym rozwiązaniem (uwierz mi - napisałem też aplikację do malowania CoreGraphics ...). Może jest inna droga, którą mogę zabrać na Androida? Jestem gotów do skoku przez co obręcze są konieczne, ale nie będę publikować aplikację, chyba że wydajność jest dobre (10fps + jak jesteś rysowanie na ekranie).

Odpowiedz

7

jestem sceptyczny, że wszystkie urządzenia z Androidem będzie wspierać dokładnie ten sam zestaw rozszerzeń OpenGL ES, albo że oni wszyscy obsługują dokładnie tę samą wersję OpenGL ES.

obiektów bufora ramki (FBOs) stanowią część specyfikacji 2,0 rdzenia OpenGL ES; jeśli twoje urządzenie z Androidem obsługuje ES 2.0, obsługuje ono FBO.

Jeśli urządzenie Android obsługuje ES 1.1, a następnie sprawdzić łańcuch przedłużający dla GL_OES_framebuffer_object wykorzystaniem glGetString (GL_EXTENSIONS).

+3

Wystarczy dla wszystkich zainteresowanych, oto GL_EXTENSIONS na kilku różnych urządzeniach z Androidem: http://www.rbgrn.net/content/345-hands-on-motorola-droid-opengl-es-specs It wygląda na to, że DROID to jedyny telefon z Androidem do obsługi framebufferów. –

Powiązane problemy