2012-04-25 3 views
4

Недавно я работал над приложением живых обоев. В том, что я узнал, что у моих Android-живых обоев есть странная проблема. Я использую свой HTC Wildfire S, вкладку Samsung Galaxy, Motorola Droid Millstone, галактику Samsung, чтобы проверить мои обои вместе с эмулятором, и все работает нормально, но на телефонах Samsung (Samsung Galaxy S II и Samsung Galaxy Player имеют симптом) экран просто остается черным для первоначального запуска. Но как только мы перейдем к экрану настроек и вернемся, чтобы просмотреть его рабочий тон. После небольшой отладки с этими телефонами я смог узнать, что обои загружаются правильно, но текстуры не просто появляются. Я попытался найти проблему, но ничего не нашел.Android OpenGL ES Текстуры, показывающие на черном экране на некоторых устройствах Samsung

Я связываю текстуру с нативным кодом. В этом я использую библиотеку OPEN GL для привязки обоев. Моя библиотека OpenGL intiation, как следующая

glEnable(GL_TEXTURE_2D); 
    glGenTextures(1, &textureConverted); 
    glBindTexture(GL_TEXTURE_2D,textureConverted); 
    //...and bind it to our array 
    __android_log_print(ANDROID_LOG_DEBUG, 
       "NDK initOpenGL()", 
       "binded texture" 
      ); 
    glTexParameterf(GL_TEXTURE_2D, 
      GL_TEXTURE_MIN_FILTER, 
      GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, 
      GL_TEXTURE_MAG_FILTER, 
      GL_NEAREST); 
    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE 
    glTexParameterf(GL_TEXTURE_2D, 
      GL_TEXTURE_WRAP_S, 
      GL_CLAMP_TO_EDGE); 
    //GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, 
      GL_TEXTURE_WRAP_T, 
      GL_CLAMP_TO_EDGE); 
    //GL_REPEAT); 
    glTexImage2D(GL_TEXTURE_2D,  /* target */ 
      0,   /* level */ 
      GL_RGBA,   /* internal format */ 
      textureWidth,  /* width */ 
      textureHeight,  /* height */ 
      0,   /* border */ 
      GL_RGBA,   /* format */ 
      GL_UNSIGNED_BYTE,/* type */ 
      NULL); 
    //setup simple shading 
    glShadeModel(GL_FLAT); 
    //check_gl_error("glShademo_comdel"); 
    glColor4x(0x10000, 0x10000, 0x10000, 0x10000); 

и в моем drawFunction

glClear(GL_COLOR_BUFFER_BIT); 
    int max; 
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max); 
    __android_log_print(ANDROID_LOG_DEBUG, 
       "NDK drawFrame()", 
       "GL_MAX_TEXTURE_SIZE: %d", 
     max); 
    glBindTexture(GL_TEXTURE_2D,textureConverted); 
    int rect[4] = {0, textureHeight, textureWidth, nTextureHeight}; 
    glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect); 

    glTexSubImage2D(GL_TEXTURE_2D, /* target */ 
      0,  /* level */ 
      0, /* xoffset */ 
      0, /* yoffset */ 
      textureWidth, 
      textureHeight, 
      GL_RGBA, /* format */ 
      GL_UNSIGNED_BYTE, /* type */ 
      pFrameConverted->data[0]); 
    glDrawTexiOES(0, 0, 0, drawWidth, drawHeight); //drawWidth is th screenwidth and drawheight is the screenheight 

Почему это не работает на телефонах Samsung?

+0

Вставьте glGetError в код и посмотрите, не попадает ли что-либо. Возможно, вы можете превысить GL_MAX_TEXTURE_SIZE, но не можете сказать точно. – Tim

+0

Я попытался с функцией glGetError() в моем коде. Он всегда возвращает 0. Так что я думаю, что нет проблем. – Satheesh

+0

вам нужно предоставить нам более подробную информацию: каковы значения textureWidth и textureHeight. Покажите нам код, где вы загружаете растровые изображения текстур и код, где вы используете glTexSubmage. – Renard

ответ

0

Я исправляю эту проблему. Это все в начале библиотеки opengl. когда я добавляю glViewport(0, 0, screenWidth, screenHeight); эту строку кода, ошибка была исправлена. Теперь мое приложение opengl отображает все устройства. Спасибо вам, ребята.

+0

Был ли ранее вызов glViewport? Кажется странным, что он работал бы на некоторых устройствах, а также фиксировал себя при обновлении на SII. Казалось бы, glViewport вызывается за кулисами на некоторых устройствах в определенных ситуациях. –

-1

некоторые устройства, которые не имеют OpenGL ES Accelerator, не могут запускать приложения, использующие OpenGL библиотеку .... Лучше фильтровать устройства в файле манифеста для предотвращения установки приложений в этих устройствах ...

+1

Это неправильно. Каждому Android-устройству необходимо поддерживать OpenGL, если он хочет передать [программу совместимости с Android] (http://static.googleusercontent.com/external_content/untrusted_dlcp/source.android.com/en//compatibility/4.0 /android-4.0-cdd.pdf). См. Главу 7.1.4. – Renard

+0

Бадди, я протестировал приложение OpenGL на HTC Wildfire S, которое не сработало и даже еще несколько устройств ... Почему я мог комментировать, не зная об этом должным образом ... – Manjunath

+0

Лесной пожар один из нескольких устройств, которые эмулируют OpenGL с программным обеспечением. Таким образом, хотя это может нарушить ваше приложение OpenGL, все же можно использовать OpenGL. Также у OP есть проблемы на Galaxy S2, у которых определенно есть GPU. – Renard