Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo llenar cada lado de un cubo con texturas diferentes en OpenGL ES 1.1?

Por favor, necesito tutoriales / ejemplos de código de cómo rellenar cada lado de un cubo con diferentes texturas en OpenGL ES 1.1

He encontrado un montón de tutoriales, pero ninguno de ellos explican claramente cómo poner diferentes texturas en cada cara y ninguno de ellos da ejemplos de código fácil de cómo hacerlo.

  • Cómo establecer maxLines y ellipsize de un TextView al mismo tiempo
  • Cómo ocultar la barra de estado de Android en el juego nativo escrito con gomobile
  • ¿Cómo ver la identidad de la persona que firmó el apk en el dispositivo Android?
  • Talking App como hablar, la grabación de audio no funcionó en todos los dispositivos
  • ¿Qué tan mala es Android SoundPool? ¿Qué alternativa usar?
  • Cómo agregar el paquete java.awt.image en Android
  • Mi código real (de los ejemplos del nehe) que dibuja un cubo con la misma textura en cada cara:

    public class Cube { /** The buffer holding the vertices */ private FloatBuffer vertexBuffer; /** The buffer holding the texture coordinates */ private FloatBuffer textureBuffer; /** The buffer holding the indices */ private ByteBuffer indexBuffer; /** Our texture pointer */ private int[] textures = new int[1]; /** * The initial vertex definition * * Note that each face is defined, even * if indices are available, because * of the texturing we want to achieve */ private float vertices[] = { //Vertices according to faces -1.0f, -1.0f, 1.0f, //Vertex 0 1.0f, -1.0f, 1.0f, //v1 -1.0f, 1.0f, 1.0f, //v2 1.0f, 1.0f, 1.0f, //v3 1.0f, -1.0f, 1.0f, //... 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, }; /** The initial texture coordinates (u, v) */ private float texture[] = { //Mapping coordinates for the vertices 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, }; /** The initial indices definition */ private byte indices[] = { //Faces definition 0,1,3, 0,3,2, //Face front 4,5,7, 4,7,6, //Face right 8,9,11, 8,11,10, //... 12,13,15, 12,15,14, 16,17,19, 16,19,18, 20,21,23, 20,23,22, }; /** * The Cube constructor. * * Initiate the buffers. */ public Cube() { // ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); byteBuf.order(ByteOrder.nativeOrder()); vertexBuffer = byteBuf.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); // byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.position(0); // indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); } /** * The object own drawing function. * Called from the renderer to redraw this instance * with possible changes in values. * * @param gl - The GL Context */ public void draw(GL10 gl) { //Bind our only previously generated texture in this case gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //Point to our buffers gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //Set the face rotation gl.glFrontFace(GL10.GL_CCW); //Enable the vertex and texture state gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); //Draw the vertices as triangles, based on the Index Buffer information gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer); //Disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); } /** * Load the textures * * @param gl - The GL Context * @param context - The Activity context */ public void loadGLTexture(GL10 gl, Context context) { //Get the texture from the Android resource directory InputStream is = context.getResources().openRawResource(R.drawable.nehe); Bitmap bitmap = null; try { //BitmapFactory is an Android graphics utility for images bitmap = BitmapFactory.decodeStream(is); } finally { //Always clear and close try { is.close(); is = null; } catch (IOException e) { } } //Generate one texture pointer... gl.glGenTextures(1, textures, 0); //...and bind it to our array gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]); //Create Nearest Filtered Texture 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); //Different possible texture parameters, eg GL10.GL_CLAMP_TO_EDGE gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); //Clean up bitmap.recycle(); } } 

  • NoSuchFieldError: No hay campo estático MapAttrs de tipo cuando se utiliza MapFragment con Play Services 6.5
  • ¿Cómo se relacionan las devoluciones de llamada de SurfaceHolder con el ciclo de vida de la actividad?
  • Instalar OpenGL ES y código de compilación para android
  • Las cadenas no parecen ser iguales en Java en Android, aunque imprimen las mismas
  • Reaccionar Android nativo se bloquea al intentar depurar en Chrome
  • Método de inyección con Dagger 2
  • 2 Solutions collect form web for “Cómo llenar cada lado de un cubo con texturas diferentes en OpenGL ES 1.1?”

    Para hacer que cada cara tenga una textura diferente, necesitará representar cada cara del cubo individualmente. Esto significa que para cada cara que necesita para establecer la textura y luego renderizar la cara (utilizando glDrawArrays o glDrawElements ). Así que sería algo así como:

     glEnable(GL_TEXTURE_2D); ... //maybe other state setup (like buffer bindings) glVertexPointer(...); glEnableClientState(GL_VERTEX_ARRAY); ... for each(face of cube) { glBindTexture(GL_TEXTURE_2D, <face_texture>); glDrawArrays(...) or glDrawElements(...); //draw only a single face } glDisableClientState(GL_VERTEX_ARRAY); ... glDisable(GL_TEXTURE_2D); ... //maybe other state cleanup 

    No puede procesar todas las caras del cubo en una llamada si necesitan diferentes texturas. Pero, por supuesto, todavía puede mantener todos ellos en una sola matriz / VBO y sólo usar los argumentos de glDrawArrays o glDrawElements para seleccionar la cara correspondiente, como hecho anteriormente.

    Este es un ejemplo de pseudo-código bastante simplificado y si todo esto suena muy extraño para ti, debes profundizar un poco más en OpenGL y aplicar una textura diferente a cada cara de un cubo es tu menor problema.

    EDIT: Ok, de acuerdo con su código actualizado: En primer lugar, ya que todas las posiciones de sus vértices y TexCoords se almacenan en los mismos arrays, no es necesario cambiar estos por cara. Además, su matriz de índices parece contener todas las caras almacenadas contigamente como 6 índices (2 triángulos) para cada cara. Todo esto hace que toda la situación sea muy fácil. Simplemente reemplace su llamada existente de glDrawElements con este bucle sobre todas las caras:

     for(i=0; i<6; ++i) { gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[i]); //use texture of ith face indexBuffer.position(6*i); //select ith face //draw 2 triangles making up this face gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_BYTE, indexBuffer); } 

    Así que para cada cara seleccionamos su textura y dibujamos sólo los 2 triángulos que corresponden a esta cara.

    En general, al aprender de muestras de código, en lugar de un libro o algo similar, al menos debe asegurarse de que entiende el significado de cada línea de código y cada parámetro de función. Sólo entonces podrá adaptar libremente el código a sus necesidades y desarrollar soluciones para los problemas.

    He logrado reunir la respuesta de los cristianos, para los interesados, aquí está el código completo de Cube.java:

     public class Cube { /** The buffer holding the vertices */ private FloatBuffer vertexBuffer; /** The buffer holding the texture coordinates */ private FloatBuffer textureBuffer; /** The buffer holding the indices */ private ByteBuffer indexBuffer; /** Our texture pointer */ private int[] textures = new int[6]; /** Textures */ private int[] resourceIds = new int[]{ R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5, R.drawable.img6}; /** * The initial vertex definition * * Note that each face is defined, even * if indices are available, because * of the texturing we want to achieve */ private float vertices[] = { //Vertices according to faces -1.0f, -1.0f, 1.0f, //Vertex 0 1.0f, -1.0f, 1.0f, //v1 -1.0f, 1.0f, 1.0f, //v2 1.0f, 1.0f, 1.0f, //v3 1.0f, -1.0f, 1.0f, //... 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, }; /** The initial texture coordinates (u, v) */ private float texture[] = { //Mapping coordinates for the vertices 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; /** The initial indices definition */ private byte indices[] = { //Faces definition 0,1,3, 0,3,2, //Face front 4,5,7, 4,7,6, //Face right 8,9,11, 8,11,10, //... 12,13,15, 12,15,14, 16,17,19, 16,19,18, 20,21,23, 20,23,22, }; /** * The Cube constructor. * * Initiate the buffers. */ public Cube() { // ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); byteBuf.order(ByteOrder.nativeOrder()); vertexBuffer = byteBuf.asFloatBuffer(); vertexBuffer.put(vertices); vertexBuffer.position(0); // byteBuf = ByteBuffer.allocateDirect(texture.length * 4); byteBuf.order(ByteOrder.nativeOrder()); textureBuffer = byteBuf.asFloatBuffer(); textureBuffer.put(texture); textureBuffer.position(0); // indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); } /** * The object own drawing function. * Called from the renderer to redraw this instance * with possible changes in values. * * @param gl - The GL Context */ public void draw(GL10 gl) { //Point to our buffers gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); //Set the face rotation gl.glFrontFace(GL10.GL_CCW); //Enable the vertex and texture state gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); for (int i=0;i<6;i++){ //Bind our only previously generated texture in this case gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]); indexBuffer.position(6*i); //Draw the vertices as triangles, based on the Index Buffer information gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_BYTE, indexBuffer); } //Disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); } /** * Load the textures * * @param gl - The GL Context * @param context - The Activity context */ public void loadGLTexture(GL10 gl, Context context) { //Generate a 6 texture pointer... gl.glGenTextures(6, textures, 0); Bitmap bitmap = null; for (int i=0;i<6;i++) { // Create a bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceIds[i]); //...and bind it to our array gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[i]); //Create Nearest Filtered Texture gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST); //Different possible texture parameters, eg GL10.GL_CLAMP_TO_EDGE gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT); gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT); //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0); //Clean up bitmap = null; } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.