2012-09-23 72 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);。希望有所幫助。