无法在opengl中加载图像

时间:2015-03-06 06:50:36

标签: java opengl

这是我的班级SimpleBox 我只得到方形纹理而不是图像 我在很多网站上都看到图像的大小应该是2的幂,我使用的图像的大小也是2的幂,但我仍然无法获得图像。

我哪里错了?

public class SimpleBox {
    private FloatBuffer box,normal;
    //private ByteBuffer bitimage;
    //private FloatBuffer normals;
    int[] textures = new int[1];
    private float[] vertices={
            -10.0f,  10.0f,  0.0f,        
            -10.0f, -10.0f,  0.0f,        
             10.0f, -10.0f,  0.0f,10.0f,  10.0f,  0.0f }; 
    private float[] normals={
            0.0f, 0.0f,  1.0f,0.0f, 0.0f,  1.0f,0.0f, 0.0f,  1.0f,0.0f, 0.0f,  1.0f         
            }; 
    private float textureCoordinates[] = {0.0f, 0.0f, 
              0.0f, 1.0f,
              1.0f, 1.0f,
              1.0f, 0.0f };

    private FloatBuffer vertexBuffer;
    private Bitmap bitmap;
    public SimpleBox(Context context) {
        bitmap =getBitmapFromAsset(context ,"images/pic4.jpg" ) ;
        box = GraphicsUtil.makeFloatBuffer(textureCoordinates);
        vertexBuffer=GraphicsUtil.makeFloatBuffer(vertices);
        normal=GraphicsUtil.makeFloatBuffer(normals);
    }


    public final void draw(GL10 gl) {   
        try{
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glGenTextures(1, textures, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

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

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

        gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

        gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, box);
        gl.glNormalPointer(GL10.GL_FLOAT,0, normal);

        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3);

        gl.glDisableClientState(GL10.GL_NORMAL_ARRAY);
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
        gl.glDisable(GL10.GL_TEXTURE_2D);
        }
        catch(Exception e)
        {
            System.out.println(e);
        }
    }

    public static Bitmap getBitmapFromAsset(Context context, String filePath) {
        AssetManager assetManager = context.getAssets();

        InputStream istr;
        Bitmap bitmap = null;
        try {
            istr = assetManager.open(filePath);
            bitmap = BitmapFactory.decodeStream(istr);
        } catch (IOException e) {
            // handle exception
            e.printStackTrace();
        }

        return bitmap;
    }
}

2 个答案:

答案 0 :(得分:0)

  1. 您尚未在GLUtils.texImage2D调用中指定纹理内部格式。它应该是例如GL_RGB
  2. 您在每次draw来电时创建纹理,但在第一次调用位图之后不再有效(bitmap.recycle();)。
  3. 您在每个draw调用上创建纹理,但从不删除它。很可能在一段时间后你会失去记忆。
  4. 简而言之,将纹理创建移出draw并更正其内部格式。

答案 1 :(得分:0)

我知道自己哪里出错了。我用" 0"将位图加载到该纹理后。因此,我得到了黑色纹理。评论完之后,我得到了图像的纹理。