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에서 발생한다.
나는 아이디어가 부족하므로 부탁드립니다. 당신이 부동의 바이트의 수를 원하는 반면
예외는 무엇입니까? –
이 생성 된 출력 파일이다 '# EXCEPTION_ACCESS_VIOLATION PC = 0x697c851e, PID = 6476, TID = 7160' 스택 트레이스 가입일 에서 (가 0xc0000005) j 개의 jogamp.opengl.gl4.GL4bcImpl.glBufferData (IJLjava/V + 37 – Mylan719
끝 부분을 디버깅하면 매개 변수가 체크 아웃됩니까? 아니요. –