使用JOGL使用VBO渲染会随机出现异常

时间:2014-09-12 09:28:33

标签: java opengl jogl vbo

我一直试图用JOGL编写渲染应用程序。但我正在解决VBO的一个问题。在linux下它每次运行都很好,但在Windows下它会一直崩溃。我不知道我错过了什么。我为各种教程提供了服务VBO的代码,因为java很少而且没有谈论JOGL。

我读过这个:

http://www.java-gaming.org/index.php?topic=25672.0 我修改了我的代码,所以我从我的类的init函数传递GL2实例,它从GLEventListener派生为函数参数,一直到我的VBOClass函数。 (我不将GL2实例存储为类属性) 但这并没有帮助

所以我的班级:

public class VBOMesh {
private int vertexVBOId;
private int normalVBOId;
private int texCoordVBOId;

public VBOMesh(GL2 gl) {
    IntBuffer ib = IntBuffer.allocate(4);

    gl.glGenBuffers(4, ib);

    vertexVBOId = ib.get(0);
    normalVBOId = ib.get(1);
    texCoordVBOId = ib.get(2);
}

public void setVetices(GL2 gl, List<Vector3> vetices)
{
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vertexVBOId);
    gl.glBufferData( GL.GL_ARRAY_BUFFER, vetices.size()*3*Float.SIZE, VectorListToFloatBuffer(vetices,3), GL.GL_STATIC_DRAW);
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}

public void setTexCoords(GL2 gl, List<Vector3> texCoords)
{
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, texCoordVBOId);
    gl.glBufferData( GL.GL_ARRAY_BUFFER, texCoords.size()*2*Float.SIZE, VectorListToFloatBuffer(texCoords,2), GL.GL_STATIC_DRAW);
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}

public void setNormals( GL2 gl, List<Vector3> normals)
{
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, normalVBOId);
    gl.glBufferData( GL.GL_ARRAY_BUFFER, normals.size()*3*Float.SIZE, VectorListToFloatBuffer(normals,3), GL.GL_STATIC_DRAW);
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
}

public void Draw( GL2 gl, List<Integer> indices)
{      
    IntBuffer indiceBuffer = Buffers.newDirectIntBuffer( indices.size() );

    for (int ind : indices) {
        indiceBuffer.put(ind);
    }

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

    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, normalVBOId);
    gl.glNormalPointer( GL.GL_FLOAT, 0, 0);
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, texCoordVBOId);
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);
    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, vertexVBOId);
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);

    gl.glDrawElements(GL.GL_TRIANGLES, indiceBuffer.capacity(), GL.GL_UNSIGNED_INT, indiceBuffer.rewind());
    //gl.glDrawArrays(GL.GL_LINES, 0, 24);

    gl.glBindBuffer( GL.GL_ARRAY_BUFFER, 0);
    gl.glDisableClientState(GLPointerFunc.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GLPointerFunc.GL_NORMAL_ARRAY);
    gl.glDisableClientState(GLPointerFunc.GL_TEXTURE_COORD_ARRAY);
}

private Buffer VectorListToFloatBuffer(List<Vector3> vectors, int floatsToTake)
{
    if(floatsToTake > 4)
    {
        throw new InvalidParameterException("floats to take greater than 4");
    }

    FloatBuffer buffer = Buffers.newDirectFloatBuffer(vectors.size()*3);

    for (Vector3 vector : vectors) 
    {
        float [] arr = {0.f,0.f,0.f};

        if(vector != null)
        {
            arr = vector.getVector3AsGLArray();
        }

        for (int i = 0; i < floatsToTake; i++) 
        {
            buffer.put(arr[i]);
        }
    }

    return buffer.rewind();
}

}

glBufferData发生异常。

我没有想法,所以我问。

1 个答案:

答案 0 :(得分:1)

Float.SIZE在一个浮点数(32)中返回的数量,而你想要浮点数中 bytes 的数量。

Float.SIZE的每个实例替换为(Float.SIZE/Byte.SIZE)4,或自定义的常量BYTES_IN_FLOAT