2012-02-18 2 views
3

У меня есть GlSurfaceView, который рисует квадрат, который я пытаюсь текстурировать с помощью image.png Я играл с двумя разными файлами png в одной и той же папке с возможностью рисования. Я обращаюсь к нему, он загружается просто отлично, но если я переключу R.image.png на другой, мой sqaure просто станет белым .. может ли кто-нибудь помочь? ниже мой квадратный класс и мой glView.некоторые изображения не загружаются - андроид openGL текстуры

Площадь:

package com.eliddell.AR; 
    import java.io.InputStream; 
    import java.nio.ByteBuffer; 
    import java.nio.ByteOrder; 
    import java.nio.FloatBuffer; 
    import javax.microedition.khronos.opengles.GL10; 
    import android.content.Context; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.opengl.GLUtils; 

    public class Square { 

     private FloatBuffer vertexBuffer; // buffer holding the vertices 

     private float vertices[] = { 
     -1.0f, -1.0f, 0.0f,  // V1 - bottom left 
     -1.0f, 1.0f, 0.0f,  // V2 - top left 
     1.0f, -1.0f, 0.0f,  // V3 - bottom right 
     1.0f, 1.0f, 0.0f   // V4 - top right 

}; 

private FloatBuffer textureBuffer; // buffer holding the texture coordinates 
private float texture[] = { 
     // Mapping coordinates for the vertices 
     0.0f, 1.0f,  // top left  (V2) 
     0.0f, 0.0f,  // bottom left (V1) 
     1.0f, 1.0f,  // top right (V4) 
     1.0f, 0.0f  // bottom right (V3) 

}; 


public Square() { 

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    vertexBuffer = byteBuffer.asFloatBuffer(); 
    vertexBuffer.put(vertices); 
    vertexBuffer.position(0); 

    byteBuffer = ByteBuffer.allocateDirect(texture.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    textureBuffer = byteBuffer.asFloatBuffer(); 
    textureBuffer.put(texture); 
    textureBuffer.position(0); 

} 
/** The texture pointer */ 
private int[] textures = new int[1]; 

public void loadGLTexture(GL10 gl, Context context) { 
    // loading texture 
    InputStream is =          context.getResources().openRawResource(R.drawable.android); 
    Bitmap bitmap = BitmapFactory.decodeStream(is); 
    //Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.android); 

    // 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); 

    // Use 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(); 
} 
public void draw(GL10 gl) { 
    // bind the previously generated texture 
    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_CW); 

    // Point to our vertex buffer 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer); 

    // Draw the vertices as triangle strip 
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 

    //Disable the client state before leaving 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); 

} 

    } 

и мой GLSurfaceView и Рендер:

package com.eliddell.AR; 

    import javax.microedition.khronos.egl.EGLConfig; 
    import javax.microedition.khronos.opengles.GL10; 
    import android.opengl.GLU; 
    import android.content.Context; 
    import android.graphics.PixelFormat; 
    import android.hardware.Camera; 
    import android.opengl.GLSurfaceView; 
    import android.opengl.GLSurfaceView.Renderer; 
    import android.view.SurfaceHolder; 

    public class GLLayer extends GLSurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback, Renderer { 

private Context context; 
private Square square; // the triangle to be drawn 


public GLLayer(Context context) { 
    super(context); 
    this.context = context; 
    this.square = new Square(); 

    // settings for translucent glView 
    this.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
    this.getHolder().setFormat(PixelFormat.TRANSLUCENT); 

    // set render to inline 
    this.setRenderer(this); 

} 

@Override 
public void onDrawFrame(GL10 gl) { 
    // clear Screen and Depth Buffer 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    // Reset the Modelview Matrix 
    gl.glLoadIdentity(); 

    // Drawing 
    gl.glTranslatef(0.0f, 0.0f, -5.0f);  // move 5 units INTO the screen 
              // is the same as moving the camera 5 units away 
    square.draw(gl);      // Draw the triangle 

} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    if(height == 0) {      //Prevent A Divide By Zero By 
    height = 1;       //Making Height Equal One 
    } 
    gl.glViewport(0, 0, width, height);  //Reset The Current Viewport 
    gl.glMatrixMode(GL10.GL_PROJECTION); //Select The Projection Matrix 
    gl.glLoadIdentity();     //Reset The Projection Matrix 
    //Calculate The Aspect Ratio Of The Window 
    GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.1f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW);  //Select The Modelview Matrix 
    gl.glLoadIdentity();     //Reset The Modelview Matrix 


} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig arg1) { 
    // Load the texture for the square 
    square.loadGLTexture(gl, this.context); 

    gl.glEnable(GL10.GL_TEXTURE_2D);   //Enable Texture Mapping (NEW) 
    gl.glShadeModel(GL10.GL_SMOOTH);   //Enable Smooth Shading 
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Black Background 
    gl.glClearDepthf(1.0f);      //Depth Buffer Setup 
    gl.glEnable(GL10.GL_DEPTH_TEST);   //Enables Depth Testing 
    gl.glDepthFunc(GL10.GL_LEQUAL);    //The Type Of Depth Testing To Do 

    //Really Nice Perspective Calculations 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

} 

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    // TODO Auto-generated method stub 

} 

    } 

ответ

2

Propably ваша текстура имеет силу доцент двух размеров. Opengl может загружать только текстуры ведьмы имеют горшок (мощность двух) размер как: 32X32, 64X64, 128X128 ..... и не 36X36, 48X48 ....

Изменить размер изображения.

+0

ruh roh .. вы правы, как вы знаете. Это вызывает беспокойство. Мой план в будущем состоял в том, чтобы текстурировать квадрат с изображениями из Интернета .. это проблема? это даже возможно? – erik

+0

Ну, в этом случае (если я понимаю правильно) вам нужно fisrt, чтобы проверить, является ли изображение из сети размером банка, и если вам не нужно изменять размер растрового изображения, прежде чем загружать его в opengl, см. Это, как изменить размер растрового http : //thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/ – SteveL

+0

Итак, теперь я пытаюсь создать png-файлы из photoshop cs5, которые можно использовать в качестве текстур. я создал изображение размером 256x256 на 72dpi и сохранено для веб-страницы как png-24, но оно не работает. Существуют ли особые шаги, отсутствующие в создании png-изображений для текстур openGL? – erik

Смежные вопросы