2014-09-12 7 views
-1

JOGL로 렌더링 응용 프로그램을 작성하려고 시도했습니다. 그러나 VBO를 사용하여 문제가 만료되었습니다. 리눅스에서는 매번 잘 실행되지만 Windows에서는 계속 충돌합니다. 나는 실종 된 것을 모른다. JOGL에 대해 말하지 않고 Java에 대해서는 거의 없기 때문에 다양한 튜토리얼을 결합하여 VBO를 제공하는 코드를 만들었습니다. JOGL을 사용하여 VBO로 렌더링이 무작위로 예외 발생

http://www.java-gaming.org/index.php?topic=25672.0

내가 내 코드를 modiefied, 그래서 난 내 VBOClass 기능에 함수 인수로 GLEventListener에서 모든 방법을 파생 내 클래스의 초기화 함수에서 GL2 인스턴스를 전달 :

나는 이것을 읽었습니다. 는 (I 클래스의 속성으로 저장 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 PC = 0x697c851e, PID = 6476, TID = 7160' 스택 트레이스 가입일 에서 (가 0xc0000005) j 개의 jogamp.opengl.gl4.GL4bcImpl.glBufferData (IJLjava/V + 37 – Mylan719

+0

끝 부분을 디버깅하면 매개 변수가 체크 아웃됩니까? 아니요. –

답변

1

Float.SIZE는 하나의 플로트 (32)의 비트의 수를 반환합니다.

Float.SIZE의 각 인스턴스를 (Float.SIZE/Byte.SIZE) 또는 단지 4으로 바꾸거나 자체 정의 상수 BYTES_IN_FLOAT으로 바꿉니다.

+0

정말 고마워요! 그것은 효과가 있었다. 나는 그 자바 VBO 튜토리얼을 내가 완전히 읽지 못했다고 믿는다. – Mylan719