Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 09:24

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Android - Texturen von Bitmap laden
BeitragVerfasst: Mo Jun 08, 2015 17:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Ich habe eine kleine Klasse für das Textur laden geschrieben.
Funktionieren tut die Klasse, aber die for-Schleife gefällt mir nicht.
Die Frage, gibt es etwas effizienteres ?

Code:
  1. public class Textur {
  2.  
  3.     private int[] id = new int[1];
  4.  
  5.     public Textur() {
  6.         GLES20.glGenTextures(1, id, 0);
  7.     }
  8.    
  9.     public void loadFromFile(String datei){
  10.         Bitmap bitmap = null;
  11.         // bitmap = BitmapFactory.decodeFile("/sdcard/test2.png");
  12.  
  13.         AssetManager assetManager = MyGLSurfaceView.mContext.getAssets();
  14.         try {
  15.             bitmap = BitmapFactory.decodeStream(assetManager.open(datei));
  16.         } catch (IOException e) {
  17.             e.printStackTrace();
  18.         }
  19.  
  20.         ByteBuffer byteBuffer = ByteBuffer.allocateDirect(bitmap.getWidth() * bitmap.getHeight() * 4);
  21.         byteBuffer.order(ByteOrder.BIG_ENDIAN);
  22.         IntBuffer ib = byteBuffer.asIntBuffer();
  23.  
  24.         int[] pixels = new int[bitmap.getWidth() * bitmap.getHeight()];
  25.         bitmap.getPixels(pixels, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
  26.         for (int i = 0; i < pixels.length; i++) {
  27.             ib.put(pixels[i] << 8 | pixels[i] >>> 24);
  28.         }
  29.  
  30.         bitmap.recycle();
  31.  
  32.         byteBuffer.position(0);
  33.        
  34.         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id[0]);
  35.  
  36.         GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap.getWidth(), bitmap.getHeight(), 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, byteBuffer);
  37.  
  38.         byteBuffer.clear();    
  39.     }
  40.  
  41.     public void activeAndBind() {
  42.         activeAndBind(0);
  43.     }
  44.  
  45.     private void activeAndBind(int Nr) {
  46.         GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + Nr);
  47.         GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id[0]);
  48.     }
  49.  
  50.     public void Destroy() {
  51.         GLES20.glDeleteTextures(1, id, 0);
  52.     }
  53. }

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 08, 2015 21:15 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Du befindest dich auf einem Handy, da willst du nicht viel Arbeit machen. Daher nimmst du nur Texturformate welche du durchreichen kannst. Somit entfällt das Konvertieren und die Schleife.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 08, 2015 21:21 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Im Klartext : z.B. sowas wie ETC1. Das kann man 1:1 an OpenGL ES durchreichen, genau wie die S3TC-Formate im normalen OpenGL.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 08, 2015 21:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Du meinst, ich sollte, z.B. mit Lazarus, eine Bitmap in ein eigenes Format umwandeln, welches ich direkt GLES20.glTexImage2D übergeben kann ?

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jun 08, 2015 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
mathias hat geschrieben:
Du meinst, ich sollte, z.B. mit Lazarus, eine Bitmap in ein eigenes Format umwandeln, welches ich direkt GLES20.glTexImage2D übergeben kann ?


Nein. ETC1 ist ein komprimiertes Texturenformat, dass, wenn die GPU die Extension kennt, direkt in den Speicher geschoben werden kann weil die GPU mit dem Format nativ umgehen kann. Um solche Texturen aus z.B. einem PNG zu erzeugen gibt es Tools wie z.B. das PVRTexTool aus dem PowerVR SDK. ETC1 ist nur eines von vielen komprimierten Formaten. Auf dem Desktop verwende ich z.B. DXT1..5 für OpenGL und KTX für OpenGL ES. Die Daten kann man quasi direkt aus dem Stream hoch zur GPU schieben ohne groß konvertieren zu müssen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 09, 2015 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Beim googeln bin ich noch auf diese Lösung gestossen:
Code:
  1. GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);


Die komprimierten Texturen sind sicher interessant für grössere Projekte .
Ich werde dies mal im Hinterkopf behalten.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jun 09, 2015 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Komprimierte Texturen sind für alle Projekte interessant. Zum einen geht das Hochladen zur GPU (in den VRAM) bedeutend schneller, und zum anderen sparen die auch beim Rendern Bandbreite, bringen also an zwei Stellen Performance.

Ich nutze schon seit Jahren nur noch komprimierte Texturen.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 25 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.063s | 17 Queries | GZIP : On ]