为什么我的android openGL ES测试渲染器崩溃

时间:2010-10-08 22:23:52

标签: java android opengl-es

我再一次尝试进入openGL,但是像往常一样,当我绕过顶点/顶点/时,我会窒息而且每一个细节都会导致灾难(格式错误,初始化设置不正确,内存保存,等)。

我的主要目标是使用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,但我确定代码存在更多问题。

感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

你可能已经解决了,但我认为我为其他人提供了答案。当你拨打这一行时:

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

您说顶点缓冲区中有3个三角形。但实际上有一个三角形。您应该用以下内容替换3:

vertices.length / 3

这样,如果您为更多多边形添加更多点,它将正确渲染它。希望这会有所帮助。

-Brian

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

答案 1 :(得分: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);

答案 2 :(得分: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 它会给你基本的