2014-09-12 2 views
-1

Я пытался записать приложение для рисования с помощью JOGL. Но я испытываю проблему с VBO. Под linux он отлично работает каждый раз, но под Windows он продолжает сбой. Я не знаю, чего мне не хватает. Я сделал свой код для обслуживания VBOs, объединяя различные учебники, потому что для java очень мало, а не о JOGL.Рендеринг с помощью VBO с использованием случайного исключения JOGL в случайном порядке

Я прочитал это:

http://www.java-gaming.org/index.php?topic=25672.0 Я modiefied моего кода, поэтому я прохожу 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.

У меня нет идей, поэтому я прошу.

+0

которое исключение? –

+0

Это из сгенерированного выходного файла: '# EXCEPTION_ACCESS_VIOLATION (0xc0000005) на рс = 0x697c851e, PID = 6476, TID = 7160' От StackTrace: J jogamp.opengl.gl4.GL4bcImpl.glBufferData (IJLjava/nio/Buffer; I) V + 67 j SceneTools.VBOMesh.setNormals (Ljavax/media/opengl/GL2; Ljava/util/List;) V + 35 – Mylan719

+0

конец, если вы отлаживаете шаг через него, проверьте параметры? –

ответ

1

Float.SIZE возвращает число бит в одном поплавке (32) в то время как вы хотите, количество байт в обращении.

Заменить каждый экземпляр Float.SIZE на (Float.SIZE/Byte.SIZE) или просто 4, или константу, определенную самостоятельно BYTES_IN_FLOAT.

+0

Большое вам спасибо! Это сработало. Я верю, что те учебные пособия по Java, которые я прочитал, пропустили это полностью. – Mylan719

 Смежные вопросы

  • Нет связанных вопросов^_^