2010-10-08 60 views
1

我再次尝试进入openGL,但像往常一样,当我绕过vertices/vertixes /时,会窒息/无论什么和每一个小细节都可能导致灾难(格式错误,初始化不行正确设置,保存内存等)。为什么我的android openGL ES测试渲染器崩溃

我的主要目标是使用OpenGL的2D图形来加快性能相比,普通的CPU绘图。

不管怎么说,我的OpenGL渲染是这样的:

package com.derp.testopengl; 


import java.nio.Buffer; 
import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 

import android.opengl.GLU; 
import android.opengl.GLSurfaceView.Renderer; 

public class OpenGLRenderer implements Renderer { 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
     // Set the background color to black (rgba). 
     gl.glClearColor(1.0f, 0.0f, 0.0f, 0.5f); // OpenGL docs. 
     // Enable Smooth Shading, default not really needed. 
     gl.glShadeModel(GL10.GL_SMOOTH);// OpenGL docs. 
     // Depth buffer setup. 
     gl.glClearDepthf(1.0f);// OpenGL docs. 
     // Enables depth testing. 
     gl.glEnable(GL10.GL_DEPTH_TEST);// OpenGL docs. 
     // The type of depth testing to do. 
     gl.glDepthFunc(GL10.GL_LEQUAL);// OpenGL docs. 
     // Really nice perspective calculations. 
     gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, // OpenGL docs. 
          GL10.GL_NICEST); 
    } 


    public void onDrawFrame(GL10 gl) { 
     // Clears the screen and depth buffer. 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | // OpenGL docs. 
          GL10.GL_DEPTH_BUFFER_BIT); 

     // Define the points of my triangle 
     float floatbuff[] = { 
       1.0f,0.0f,0.0f, 
       0.0f,1.0f,0.0f, 
       -1.0f,0.0f,0.0f 
       }; 
     // Create memory on the heap 
     ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
     vbb.order(ByteOrder.nativeOrder()); 
     FloatBuffer vertices = vbb.asFloatBuffer(); 

     // Insert points into floatbuffer 
     vertices.put(floatbuff); 
     // Reset position 
     vertices.position(0); 

     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

     // Change color to green 
     gl.glColor4f(0.0f, 1.0f, 0.0f, 1.0f); 

     // Pass vertices to openGL 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices); 

     // Draw 'em 
     gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    } 


    public void onSurfaceChanged(GL10 gl, int width, int height) { 
     // Sets the current view port to the new size. 
     gl.glViewport(0, 0, width, height);// OpenGL docs. 
     // Select the projection matrix 
     gl.glMatrixMode(GL10.GL_PROJECTION);// OpenGL docs. 
     // Reset the projection matrix 
     gl.glLoadIdentity();// OpenGL docs. 

     // Should give a 2D coordinate system that responds to the screen 
     gl.glOrthof(0.0f, width, 0.0f, height, 0, 200.0f); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity();// OpenGL docs. 
    } 
} 

目前,它崩溃就行了:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

随着IndexOutOfBoundsException异常,但我敢肯定有更多的问题与代码。

感谢您的帮助!

回答

0

尝试改变这一点:

// Create memory on the heap 
ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
vbb.order(ByteOrder.nativeOrder()); 
FloatBuffer vertices = vbb.asFloatBuffer(); 

// Insert points into floatbuffer 
vertices.put(floatbuff); 
// Reset position 
vertices.position(0); 

这样:

FloatBuffer vertices = FloatBuffer.wrap(floatbuff); 
1

你可能已经解决了这个问题,但我想我把答案为别人。当你叫这条线时:

gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3); 

你说的是在顶点缓冲区中有3个三角形。但实际上有一个三角形。您应该替换3:

vertices.length/3 

这样,如果你把更多的多边形任何更多的点,它会正确地渲染。希望这可以帮助。

-Brian

PS:我目前正在学习如何在android中使用opengl。所以我也在搞清楚所有这些小问题。祝你好运:)

0

它可能不会回答,但建议... 不要把下面的代码放在OnDrawFrame中,因为你的三角坐标不会改变...在onSurfaceCreated中做这个东西。 使FloatBuffer类

// Define the points of my triangle 
    float floatbuff[] = { 
      1.0f,0.0f,0.0f, 
      0.0f,1.0f,0.0f, 
      -1.0f,0.0f,0.0f 
      }; 
    // Create memory on the heap 
    ByteBuffer vbb = ByteBuffer.allocateDirect(3 * 3 * 4); 
    vbb.order(ByteOrder.nativeOrder()); 
    FloatBuffer vertices = vbb.asFloatBuffer(); 

    // Insert points into floatbuffer 
    vertices.put(floatbuff); 

的成员变量来看看这个类TriangleRenderer.java 它会给你一个基本