Как определить возможности OpenGL без создания GLSurfaceView (Android)

1

Я пытаюсь получить доступ к возможностям OpenGL для телефона, прежде чем решать, использовать ли OpenGL или Canvas для рисования. Тем не менее, все функции, которые я могу прочитать для документации, требуют, чтобы у вас уже был допустимый контекст OpenGL (а именно, создайте GLSurfaceView и назначьте его рендерингом. Затем проверьте параметры OpenGL в onSurfaceCreated).

Итак, есть ли способ проверить расширения, имя визуализатора и максимальный размер шрифта телефона перед тем, как создавать любые просмотры OpenGL?

Теги:
opengl-es

3 ответа

2

После поиска я пришел к выводу, что мне нужен действительный контекст GL, прежде чем я могу запросить его для его возможностей. Это, в свою очередь, требует Поверхности и т.д. В основном вам нужно создать поверхность OpenGL, прежде чем вы сможете проверить, что она поддерживает.

Итак, вот что я сделал: я создал новую активность (GraphicChooser, мне нужно работать с именами классов...), которая запускается вместо обычной работы. Это действие создает GLSurfaceView, который проверяет возможности устройства в onSurfaceCreated. В зависимости от того, что найдено, он запускает основное действие с некоторыми флагами о графических опциях, которые нужно использовать, а затем выходит. Каждый режим активности установлен в singleTask, поэтому выход из него не влияет на другой, и может быть только один экземпляр каждого из них. Например, после нажатия кнопки "домой" и перезапуска активности GraphicChooser, это приведет к новому намерению основной активности, которая по-прежнему активна, но не создаст новую.

Это очень грубо, и, конечно, лучший способ сделать это, но я не мог его найти. Основной недостаток заключается в том, что каждый раз, когда вы начинаете свою деятельность, есть накладные расходы на создание дополнительного.

package com.greencod.pinball.android;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.app.Activity;
import android.content.Intent;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;

public class GraphicChooser extends Activity {

   private GLSurfaceView mGLView;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       Log.d("Graphic Chooser", "onCreate: create view and renderer.");
       // get the screen size
       Display display = getWindowManager().getDefaultDisplay();
       int width = display.getWidth();
       int height = display.getHeight();

       mGLView = new GLSurfaceView(this);
       mGLView.setRenderer(new GraphicChooserRenderer(this, width, height));
       setContentView(mGLView);
   }

   @Override
   protected void onResume() {
      super.onResume();

      Log.d("Graphic Chooser", "onResume: purely for testing purpose.");
   }

   @Override
   protected void onDestroy() {
      super.onDestroy();

      Log.d("Graphic Chooser", "onDestroy: Bye bye.");
   }

   static final int GAME_ACTIVITY_REQUEST_CODE = 10;
   public void launchGraphics(int type)
   {
      // launch game activity and kill this activity
      Intent i = new Intent(this, PinballActivity.class);
      i.putExtra("Graphics", type);
      // the activity requested should go in a new task, so even if we are passing
      // a request code, we will not get it when the new activity stops, but right now
      // as a 'cancel' request. That is ok, just quit this activity then.
      startActivityForResult(i, GAME_ACTIVITY_REQUEST_CODE);
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if( requestCode == GAME_ACTIVITY_REQUEST_CODE )
         finish();
   }
}

class GraphicChooserRenderer implements GLSurfaceView.Renderer{

   GraphicChooser _activity;
   final int _width, _height;
   public GraphicChooserRenderer( GraphicChooser activity, int width, int height )
   {
      _activity = activity;
      _width = width;
      _height = height;
   }

   final int GRAPHICS_CANVAS = 0;
   final int GRAPHICS_OPENGL_DRAW_TEXTURE = 1;

   public void determineGraphicSupport(GL10 gl)
   {
      int _graphicEngine = GRAPHICS_CANVAS;

      String extensions = gl.glGetString(GL10.GL_EXTENSIONS); 
//      String version = GLES10.glGetString(GL10.GL_VERSION);
      String renderer = gl.glGetString(GL10.GL_RENDERER);
      boolean isSoftwareRenderer = renderer.contains("PixelFlinger");
      boolean supportsDrawTexture = extensions.contains("draw_texture");
      int[] arGlMaxTextureSize = new int[1];
      gl.glGetIntegerv( GL10.GL_MAX_TEXTURE_SIZE, arGlMaxTextureSize, 0 );

      if( !isSoftwareRenderer && supportsDrawTexture && _width >= 480 && _height >= 800 
            && arGlMaxTextureSize[0] >= 2048 )
         _graphicEngine = GRAPHICS_OPENGL_DRAW_TEXTURE;
      else
         _graphicEngine = GRAPHICS_CANVAS;

      Log.i("pinball", "Graphics using " + (_graphicEngine==GRAPHICS_CANVAS?"Canvas":"OpenGL EOS draw texture")
            + ". OpenGL renderer: " + renderer
            + ". Software renderer: " + isSoftwareRenderer
            + ". Support draw texture: " + supportsDrawTexture 
            + ". Texture max size: " + arGlMaxTextureSize[0]
            + ". Resolution: " + _width + "x" + _height );

      _activity.launchGraphics(_graphicEngine);
   }

   public void onSurfaceCreated(GL10 gl, EGLConfig config) {
      determineGraphicSupport(gl);
   }

   public void onSurfaceChanged(GL10 gl, int w, int h) {
      gl.glViewport(0, 0, w, h);
   }

   public void onDrawFrame(GL10 gl) {
      gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
   }  
}
  • 0
    Привет ADB, я столкнулся с этой проблемой для запуска моего GLSurfaceview в Android. здесь я использовал технологию opgneles2.0. пожалуйста, посмотрите мне проблему в этой ссылке на stackoverflow и помогите мне решить эту проблему .. stackoverflow.com/questions/17187032/…
1

Предоставлено нашими друзьями в Google:

Запустите следующий код на целевых устройствах, чтобы определить, какие форматы сжатия текстур поддерживаются:

String extenstions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);

http://developer.android.com/guide/topics/graphics/opengl.html docs

  • 0
    Привет TheDudeAbi, где я могу поместить этот код в программу ..
  • 0
    @harikrishnan использует этот метод против прокси в выбранной вами среде (например, эмуляторе, реальном телефоне или Java), чтобы получить конкретную информацию, которая поможет вам принять определенное решение.
Показать ещё 2 комментария
0

Для расширений:

EGLDisplay display = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
String extensions = EGL14.eglQueryString(display, EGL14.EGL_EXTENSIONS);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню