Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

05.03.2011, 10:58

Probleme mit OpenGL ES 2.0 unter Android 2.2

Ich will mich endlich mal auf Android 2.2 mit Java und dem Android NDK wagen. Natürlich will ich mich auch hier hauptsächlich mit Computer Grafik beschäftigen.
Dies geht hier mit OpenGL ES 1.0, 1.1 und seit Android 2.2 auch schon mit GLES 2.0.
Die ganzen Beispiele aus dem Buch "Hello, Android" für Einsteiger in die Android Progarmmierung, das ich mir dazu gekauft hatte, habe ich schon kompiliert, getestet (im Android Emulator) und sogar schon teilweise auf meinem eigenen Samsung Galaxy S ausgeführt.
Auch herumgespielt am Source Code der Beispiele habe ich bereits. Funktioniert alles wunder bar.

Nun möchte ich aber mal mit OpenGL ES 2.0 und dessen Shader support herumspielen. Dazu gibt es in dem Buch leider kein Beispiel.
Ich habe das OpenGL Beispiel (da wird GLES 1.0 verwendet) umgeschrieben damit es GLES 2.0 unterstützt. Von Seiten des Source Codes scheint jetzt eig. alles richtig zu sein, aber ich befürchte, dass einige andere Abhängigkeiten noch nicht richtig eingestellt sind. z.B. glaube ich, dass es nicht reicht die OpenGL.apk mit zu linken.
Ich denke es müsste noch eine ähnliche Datei für GLES 2.0 geben, da sich dort allgemein einiges verändert hat.
Denn sobald Funktionen wie "GLES20.glCreateShader(...)" aufgerufen werden, kommt die Fehlermeldung "call to unsupported OpenGL-ES APIs" und das Programm stürtzt ab.
Aber in der Datei "AndroidManifest.xml" habe ich bereits das feature <uses-feature android:glEsVersion="2" /> gesetzt und auch die minSdkVersion auf # 8, ebenso wie targetSdkVersion.

Hat jemand von euch schon mal mit OpenGL ES 2.0 in Java auf Android gearbeitet?? Wenn ja, was muss ich alles machen, damit die App auch wirklich mit GLES20 läuft??

Beiträge: 721

Wohnort: /dev/null

Beruf: Software-Entwickler/Nerd

  • Private Nachricht senden

2

05.03.2011, 12:00

Unterstützt dein Device denn OGLES 2.0?

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

05.03.2011, 12:59

Unterstützt dein Device denn OGLES 2.0?

Ja, denn es hat bereits Android 2.2. Aber ich will ja, dass es überhaupt erst mal auf dem Emulator richtig läuft ;)

4

17.03.2011, 19:00

Ganz so einfach wie du denkst ist es leider nicht.

Als aller erstends: nur weil du ein Android 2.2 Gerät hast heisst das noch lange nicht dass da OpenGL ES 2.0 damit läuft. Das heisst nur dass es a) die API dazu gibt und b) wenn dein Gerät die entsprechende Hardware und Treiber hat dass Applikationen dann OGLES 2 verwenden könnnen.

Wichtig: OpenGL ES 2.0 ist nicht eine Erweiterung von GLES 1.x sondern eine komplett neue Spezifikation. Heisst konkret dass es absolut keine direkte kompatibilität zwischen den beiden gibt! Das ist auch der Punkt wiso z.b der Emulator nicht gles 2 kann. GLES 2.0 ist komplet dynamisch (siehe weiter unten) und kann daher nicht ohne weiteres einfach mal so emulitert werden wie es mit gles 1.x noch möglich war.

Eine GLES 1.x applikation kann zudem nicht ohne grossen Aufwand auf gles 2.0 portiert werden, da es ja eben komplet etwas neues ist. Bei Gles 1.x hatte man eine fix rendering pipeline. Das bedeutet dass das gesammte rendering eigentlich fix ist und der Programmierer nur noch Parameter festlegen konnte/musste. Z.b renders du das dein Objekt A (als Vertex Buffer mit Vertex Punkten, Texturkoordinaten etc) aus der Sicht B mit den Beleuchtungs Konfiguration C und so weiter. Alle diese Parameter gibs du dann in die Black-Box und diese zeichnet das Objekt dann. Bei OpenGl ES 2.0 musst (ist nicht optional, es ist wirklich Pflicht) du diese "Black Box" selbst in Form von Shadern implementieren. Das funktioniert grob etwa so:

- du hast immer einen Vertex und einen Fragment (Pixel) Shader. Der Vertex Shader berechnet sozusagen die darzustellende Fläche und der Pixel Shader berechnet dann die Farbe jedes Pixels auf der Fläche.

- z.B übergibst du dem Vertex Shader den input wie z.b die Positionen der 3D Punkte deines Modelles, Textur Koordinaten etc.

- der Fragment Shader berechnet dann die Farbe pro Pixel, z.B basierend auf der Textur und dem Winkel des einfallenden Lichtes.



Im Grund eigentlich nichts neues, nur dass Vertex und Pixel Shader in Gles 1.x fix waren und du dort nur Parameter setzten konntest, z.b welche Texur verwendet wird, wo Lichtquellen sind oder welche PErspektive benutzt werden sollen.

Die Frage die du dir stellen musst ist wie gut du dich mit Computergrafik auskennst? Wenn du weisst wie du mit den Transformationen umgehen musst und wie z.B Lichteinfall etc berechnet wird (also wie z.b OpenGL ES 1.x deinen input auf den Bildschirm bringt) dann solltest du das schnell im Griff haben. Falls nicht muss du dich schlau machen, ganz trivial ist es nämlich nicht. Ev werde ich den Code meiner "Tigre für OpenGL ES 2.0" Engine auf meiner Seite zur Verfügung stellen. Dort siehst du wie man mit OpenGL ES 2.0 umgehen kann (ist in C# geschrieben, dürfte für Leute die Java coden kein Problem sein).

Hoffe das hilft dir weiter :P

Werbeanzeige