Я пытался записать приложение для рисования с помощью 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.
У меня нет идей, поэтому я прошу.
которое исключение? –
Это из сгенерированного выходного файла: '# 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
конец, если вы отлаживаете шаг через него, проверьте параметры? –