2012-02-18 29 views
3

我有一个GlSurfaceView,正在绘制一个正方形,我试图用image.png纹理我已经玩过两个不同的PNG文件,都在同一个可绘制的文件夹..当我参考一个它加载得很好,但如果我将R.image.png切换到另一个,我的sqaure变成白色..任何人都可以帮忙吗?下面是我的方形课,和我的glView。一些图像将不会加载 - android的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你的纹理dosent有两个方面的力量。 Opengl可以加载只有纹理女巫有锅(功率为两个)大小像:32X32,64X64,128X128 .....而不是36X36,48X48 ....

更改您的图像大小。

+0

ruh roh ..你说得对,就像你知道的一样。我前进的计划是用来自网络的图像纹理方块。这是一个问题吗?它甚至有可能吗? – erik 2012-02-18 14:39:05

+0

那么在这种情况下(如果我理解的权利),你需要fisrt来检查如果图像来自web是罐大小,如果不是你需要调整位图的大小,然后再加载到opengl看到这个如何调整位图http ://thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/ – SteveL 2012-02-18 16:08:48

+0

好吧,现在我正在尝试从photoshop cs5创建可用作纹理的png文件。我创建了一个图像,在72dpi为256x256,并保存为网页作为PNG-24,但它不工作。在为OpenGL纹理创建png图像时是否缺少特殊步骤? – erik 2012-02-19 21:33:12