2010-08-24 23 views
92

Bueno, aquí está mi pedido. Ya no conozco OpenGL, y no estoy dispuesto a aprenderlo, quiero aprender OpenGL ES directamente, ya que estoy enfocando mi desarrollo en Android, sin embargo. Quiero aprender OpenGL ES para desarrollar mis juegos 2D. Lo elegí para fines de rendimiento (ya que el dibujo básico de SurfaceView no es tan eficiente cuando se trata de juegos RT). Mi pregunta es: ¿por dónde empezar? He pasado más de un mes de navegación Google y de lectura/tratando algunos tutoriales/ejemplos que he encontrado en cualquier lugar, pero para ser honesto, no ayudó mucho y esto es por dos razones:Android OpenGL ES y 2D

  1. Casi todos los artículos/tutoriales con los que me he encontrado están relacionados con 3D (solo quiero aprender cómo hacer mi dibujo Sprites 2D)
  2. No hay base para comenzar, ya que todos los artículos se enfocan en cosas específicas como: "Cómo dibujar un triángulo (con vértices) "," Cómo crear una malla "... etc.

He intentado re y también un código fuente (por ejemplo: réplica de la isla) pero los códigos son demasiado complicados y contienen muchas cosas que no son necesarias; Resultado: Me pierdo entre 100 archivos .java con nombres de clases raras y esas cosas.

Supongo que no hay ningún curso como el que yo estoy buscando, pero estaré muy contento si alguien me podría dar algunas pautas y algunos enlaces tal vez para aprender lo que estoy haciendo (sólo OpenGL ES Representación de Sprites 2D! Nada 3D).

+32

'y no estoy dispuesto a aprenderlo' No es una buena manera de comenzar una pregunta aquí – Falmarri

+56

Lea toda mi pregunta, tomó una parte sensible y dejó la conclusión más importante:" No lo hago " Ya conozco OpenGL, y no estoy dispuesto a aprenderlo, quiero aprender OpenGL ES directamente ya que estoy orientando mi desarrollo a Android " ¿De qué sirve aprender OpenGL si voy a trabajar solo con OpenGL? ES en dispositivos integrados? Cheers – CoolStraw

+5

Dado que OpenGL ES es en su mayoría un subconjunto de OpenGL, no veo el sentido de decir que no va a aprender OpenGL, ya que, por definición, tendrá que hacerlo. –

Respuesta

84

Estaba en una situación similar.
La forma en que comencé con OpenGL con el inicio mirando las muestras/demostraciones de GLSurfaceView muy básicas.

Comience, configurando la actividad de su aplicación y configurando el lienzo básico.

Tome un botín en el archivo de código fuente de la isla réplica: GameRenderer.java para saber cómo configurar su lienzo con los indicadores GL adecuados para renderizado 2D (sprite). realmente debería echar un vistazo a SpriteMethodTest por el mismo autor de la isla de réplica: http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest

Ver esta pregunta dónde he publicado mi propio código: Using OpenGL to replace Canvas - Android

Después de haber configurado el lienzo, se empieza por llamar a algo como: gl.glClear (GL10.GL_COLOR_BUFFER_BIT);

Después de eso, ya está listo para renderizar un sprite. En primer lugar, tendrá que cargar el sprite en una textura: http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

Sin embargo, este es el tutorial que realmente me ayudó con los sprites de carga: http://tkcodesharing.blogspot.com/2008/05/working-with-textures-in-androids.html

así es como lo hago, tengo una clase llamada Texture.java: método

public class Texture 
{ 
    /*Begin public declarations*/ 
    public float x = 0; 
    public float y = 0; 
    public float z = 0; 
    public float width = 0; 
    public float height = 0; 
    /*Begin Private Declarations*/ 
    private GL10 gl; 
    public int[] texture; //holds the texture in integer form 
    private int texture_name; 
    private int[] mCropWorkspace; 
    private final BitmapFactory.Options sBitmapOptions; 


/*Begin Methods*/ 
public Texture(GL10 gl_obj) 
{ 
    gl = gl_obj; 
    texture = new int[1]; 
    mCropWorkspace = new int[4]; 
    sBitmapOptions = new BitmapFactory.Options(); 
    sBitmapOptions.inPreferredConfig = Bitmap.Config.RGB_565; 
    //Log.d(TAG, "Initializing Texture Object"); 
}  
public int get_texture_name() 
{ 
    return texture_name; 
} 

/*Loads the resource to memory*/ 
public boolean Load(Bitmap bitmap) //rename this to glLoad and don't have it as an initializer parameter 
{ 
    /*many thanks to sprite method test if this works*/ 
    if (gl == null) 
    { 
     Log.e(TAG, "Failed to load resource. Context/GL is NULL"); 
     return false; 
    } 
    int error; 

    int textureName = -1; 
    gl.glGenTextures(1, texture, 0); 
    textureName = texture[0]; 

    //Log.d(TAG, "Generated texture: " + textureName); 
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE); 
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE); 

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); 

    mCropWorkspace[0] = 0; 
    mCropWorkspace[1] = bitmap.getHeight(); 
    mCropWorkspace[2] = bitmap.getWidth(); 
    mCropWorkspace[3] = -bitmap.getHeight(); 

    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
      GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0); 

    error = gl.glGetError(); 
    if (error != GL10.GL_NO_ERROR) 
    { 
     Log.e(TAG, "GL Texture Load Error: " + error); 

    } 
    //Log.d(TAG, "Loaded texture: " + textureName); 
    return true; 
} 
} 

Luego, en mi onDrawFrame() yo simplemente hago:

Texture texture = ... 
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture.texture[0]); 
((GL11Ext) gl).glDrawTexfOES((float)(draw_x + 0.5), (float)(draw_y + 0.5), 0, tile_width, tile_height); 

Eso debería ayudarte a dibujar sprites 2D en un lienzo OpenGL. Me he dado cuenta de que realmente no hay un tutorial sencillo sobre esto. Espero que en el futuro publique uno en mi blog de desarrollo: http://developingthedream.blogspot.com/

+6

¡Muchas gracias! ¡Nunca recibí instrucciones como estas, eso es exactamente lo que estaba buscando! Y estaré atento a su blog, esperamos que nos brinde excelentes tutoriales en el futuro :), de nuevo muchas gracias – CoolStraw

+1

en la misma situación que OP y tan agradecido como él por su respuesta. Buena suerte con tu Juego/Blog. THX otra vez – unR

+1

Gracias @Miguel Morales Estaba cansado de buscar dibujo 2D con GL. Como dijo CoolStraw, hay demasiados tutoriales con muchas cosas innecesarias. Esa respuesta fue clara como un cristal. –

11

La programación 2D es solo programación 3D restringida a un plano. No tendrá más remedio que aprender 3D, pero cuando lo esté utilizando simplemente configure z = 0.

Hay un libro oficial sobre OpenGL ES. Eso podría dar la intro que lo que busca es: http://www.amazon.com/OpenGL-ES-2-0-Programming-Guide/dp/0321502795/

+7

Para ser pedante, todavía usa Z para que pueda dejar que el hardware lo haga por usted. El gran cambio es que (probablemente) la aplicación 2D utilizará una vista ortográfica en lugar de una vista en perspectiva. –

+0

Muchas gracias por su respuesta, su declaración me muestra que estaba equivocado acerca de la definición de Opengl y Opengl ES. – CoolStraw

2

Sin duda la caja Android - Chris Pruett Google IO conferencia escritura juegos en tiempo real para Android redux

agarrar el PDF también

es muy útil en muchos niveles, Chris tiene realmente una gran experiencia con la creación de juegos para dispositivos móviles

pero si usted está realmente centrado en 2D y luego comenzar con lienzo http://developer.android.com/guide/topics/graphics/index.html#drawing-with-canvas

Otra opción depende del nivel de habilidad es Flash + AdobeAIR para Android, me gusta y nivel de programación luv ya medida que avanzas en el desarrollo descubrirás por qué.

OpenGL: Comprobar si - Nehe Producciones

un par de aplicaciones es posible que desee poner en su teléfono que vale la pena y que están libres es: OpenGL demo, Marco min3d, RedBook Muestra

1

Veo que mucha información buena ya ha sido proporcionada. ¡Quería compartir un sitio que me ayudó a acelerar en OpenGLE rápido! Solo tomó unos meses y tenía un sistema de coordenadas personalizado basado en el sistema de coordenadas cartesianas. Pude renderizar el objeto 3D sin cámara usando técnicas de Realidad Aumentada.

Empecé con solo experiencia en programación, sin experiencia OpenGL. Usé el sitio de tutoriales de Ray Wenderlich. La información proporcionada allí es de primera clase y fácil de comprender. Él corta la mayoría de la información superflua y le proporciona lo que necesita saber para ser productivo rápidamente. Recomiendo este tutorial como punto de partida: http://www.raywenderlich.com/5223/beginning-opengl-es-2-0-with-glkit-part-1

El otro recurso que recomiendo es un libro de Erik M Buck, titulado Learning OpenGL ES para iOS.

Learning OpenGL ES for iOS book cover art

Algunos lo criticaron diciendo que era demasiado simplista. Pero eso es exactamente lo que estaba buscando. Me ayudó a entender todos los conceptos básicos y me dio una idea de dónde debería ir después para aprender cosas más avanzadas. Pero como era de esperar, pude construir mi aplicación de realidad aumentada usando las técnicas simples que había aprendido del sitio de Ray y el libro de Erik. ¡Gracias a ambos por compartir!