2012-09-23 48 views
1

我已经做了在Android OPENGL库中的3D立方体,立方体的作品很漂亮,但是在对多维数据集打印图像不显示...的Android - 3D魔方用OpenGL +纹理

下面的代码我的渲染(Java类)的:

public class GLRenderEx implements Renderer { 

    private GLCube cube; 
    Context c; 

    public GLRenderEx(Context c) { 
     cube = new GLCube(); 
     this.c = c; 
    } 

    @Override 
    public void onDrawFrame(GL10 gl) { 
     gl.glDisable(GL10.GL_DITHER); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 
     GLU.gluLookAt(gl, 0, 0, -3, 0, 0, 0, 0, 2, 0); 

     long time = SystemClock.uptimeMillis() % 4000L; 
     float angle = .090f * ((int) time); 
     gl.glRotatef(angle, 2, 4, 3); 

     cube.draw(gl); 

    } 

    @Override 
    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     // TODO Auto-generated method stub 
     gl.glViewport(0, 0, width, height); 
     float ratio = (float) width/height; 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 
     gl.glFrustumf(-ratio, ratio, -1, 1, 1, 25); 
    } 

    @Override 
    public void onSurfaceCreated(GL10 gl, EGLConfig egl) { 
     gl.glDisable(GL10.GL_DITHER); 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
     gl.glClearColor(0f, 0f, 0f, 1); 
     gl.glClearDepthf(1f); 
    } 

} 

这里是我的立方体代码:

public class GLCube { 

    /** 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 GLCube() { 
     // 
     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]); 
     gl.glEnable(GL10.GL_TEXTURE_2D); 
     // 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.ic_launcher); 
     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, e.g. GL10.GL_CLAMP_TO_EDGE 
     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); 

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

为什么我的代码在立方体??不显示位图!

谢谢。

+0

它看起来像你在你的设置中忘记了'glActiveTexture(GL_TEXTURE0)'。 –

回答

0

我遇到了一些问题。

造成我的问题的原因是纹理不完全匹配立方体。

仔细检查您的代码,您可能会注意到一些不匹配。

+1

你在哪里这是错误? –

+0

只是经验。你已经检查了所有可能导致问题的东西。但是基础比赛可能有问题,我只是说“可能”,希望能帮助你。 –

1

如果你想你的纹理对象,您必须启用与glEnable(GL_TEXTURE_2D);

纹理我没有看到你的代码本的任何地方。

+0

我已经更新了代码,并且在渲染类中启用了它,但它似乎不起作用... –

+0

您的英语不是特别清楚,究竟是什么不工作?你的结果是什么样的,你能链接到一张图片吗? @MarcOrtiz – Tim

+0

我的多维数据集正在工作(移动x,y,z),但纹理不在多维数据集上(图像) –

2

我查看了您的代码,但没有找到地方,请拨打loadGLTexture()。当我实现你的代码来制作纹理时,我只是在onDrawFrame()方法中加上了cube.loadGLTexture(gl, c);以上的cube.draw(gl);。希望有所帮助。