5

Mam aplikację OpenGL ES2.0, która działa na urządzeniach z różnymi wersjami systemu Android od 2.2 do 4.1. Jednak powiedziano mi, że podczas uruchamiania na Nexusie 7 z Androidem 4.2, grafika 3D w aplikacji jest czarna. Pasek akcji i okna dialogowe działają jednak dobrze. Próbowałem go na emulowanym Nexusie 7 z procesorem Intel Atom, HAX i GPU z uruchomionym 4.2.2 i to działa dobrze. Wolałbym uruchomić obraz ARM, ale to nie wydaje się obejmować OpenGL ES2.0GLSurfaceView wyświetla czarny na Nexusie 7 z Androidem 4.2

Czy ktoś ma jakiś wgląd w to, co może być przyczyną tego problemu na Nexus 7 i jak go obejść?

Jedna z możliwości jest taka, że ​​bieżąca wersja aplikacji ma docelowy poziom interfejsu API ustawiony na 15, podczas gdy 4.2.2 na poziomie 17. Czy to może być problem? Działa to jednak na emulatorze.

Poniżej znajduje się kod, którego używam do ustawiania tekstur w rendererze onSurfaceCreated() w przypadku jakiejkolwiek pomocy.

/** 
* Sets up texturing for the object 
*/ 
private void setupTextures(String[] texFiles) { 
    // create new texture ids if object has them 
    // number of textures 
    mTextureIDs = new int[texFiles.length]; 

    GLES20.glGenTextures(texFiles.length, mTextureIDs, 0); 

    for(int i = 0; i < texFiles.length; i++) { 
     GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]); 

     // parameters 
     GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, 
       GLES20.GL_NEAREST); 
     GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
       GLES20.GL_TEXTURE_MAG_FILTER, 
       GLES20.GL_LINEAR); 

     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
       GLES20.GL_REPEAT); 
     GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
       GLES20.GL_REPEAT); 

     int ID = mContext.getResources().getIdentifier(texFiles[i], "raw", "com.antonymsoft.slidixcube"); 
     InputStream is = mContext.getResources().openRawResource(ID); 
     Bitmap bitmap; 
     try { 
      bitmap = BitmapFactory.decodeStream(is); 
     } finally { 
      try { 
       is.close(); 
      } catch(IOException e) { 
       // Ignore. 
      } 
     } 

     // create it 
     GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 

    } 
} 
+0

Jeśli powierzchnia jest całkowicie czarna, myślę, że problem był bardziej istotny niż obciążenie teksturami. Jaka jest twoja rendermode? W jaki sposób konfigurujesz swój kontekst GL? –

+0

@ReubenScratton Dziękujemy za odpowiedź! Poniższe linie ustawiają mój kontekst i rendermode z konstruktora mojej klasy wywodzącego się z GLSurfaceView. '// Utwórz kontekst OpenGL ES 2.0. setEGLContextClientVersion (2); // Ustaw Renderer do rysowania na GLSurfaceView mCubeSize = 2; mCubeRenderer = new CubeRenderer (context); setRenderer (mCubeRenderer); // renderuj widok tylko wtedy, gdy nastąpiła zmiana w danych rysunku setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); ' – tonyw

+0

Och, zapomniałem też powiedzieć, że tworzę instancję mojej podklasy GLSurfaceView przy użyciu układu XML, a następnie używam findViewById() w celu pobrania referencji. – tonyw

Odpowiedz

4

Jaki jest twój rozmiar tekstury? Powinna być potęgą dwóch, na przykład 16x32 512x512 1024x512 i tak dalej.

+1

Tak, to było to. Co zadziwiające, niektóre urządzenia nadal nie obsługują braku mocy dwóch tekstur. – tonyw

Powiązane problemy