lwjgl рисует массив элементов

#opengl #draw #lwjgl

#opengl #рисовать #lwjgl

Вопрос:

около 3 часов я пытаюсь нарисовать простой 3D-треугольник, используя функцию glDrawElement, но, похоже, я что-то делаю неправильно, вот что я делаю :

 float[] verts = new float[9];
 int[] tris = new int[3];
 verts[0]=0;verts[1]=0;verts[2]=0;
 verts[3]=0;verts[4]=1;verts[5]=0;
 verts[6]=1;verts[7]=0;verts[8]=1;
 tris[0]=3;
 tris[1]=2;
 tris[2]=1;

vertBuffer= BufferUtils.createFloatBuffer(verts.length);
trisBuffer= BufferUtils.createIntBuffer(tris.length);

vertBuffer.put(verts);
vertBuffer.flip();

trisBuffer.put(tris);
trisBuffer.flip();
 

это для создания буферов.

 if(VBOID==-1)VBOID=GL15.glGenBuffers(); 
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOID);
GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertBuffer,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);

if(VAOID==-1)VAOID=GL15.glGenBuffers();
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, VAOID);
GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, trisBuffer,GL15.GL_STATIC_DRAW);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
 

это для буферов привязки

 glEnableClientState(GL_VERTEX_ARRAY);
GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, VBOID);
    glVertexPointer(3, GL_FLOAT, 0, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, VAOID);

    glPushMatrix();{
        glDrawElements(GL_TRIANGLES, WIDTH*HEIGHT*2, GL_INT, 0);

    }glPopMatrix();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
    Display.update();
 

это код для рисования
Это работает, когда я рисую его напрямую, не передавая индексы, но так это не работает.
Я надеюсь, что кто-нибудь может сказать мне, что не так с этим кодом.

Ответ №1:

Здесь у вас есть пара проблем. Во-первых, индексы в OpenGL основаны на 0. Поэтому вместо этого:

 tris[0]=3;
tris[1]=2;
tris[2]=1;
 

вам нужно это:

 tris[0]=2;
tris[1]=1;
tris[2]=0;
 

Тогда GL_INT недопустимый тип индекса для передачи в качестве 3-го аргумента glDrawElements() . Единственными допустимыми типами являются GL_UNSIGNED_BYTE , GL_UNSIGNED_SHORT , и GL_UNSIGNED_INT . Хотя Java не имеет типов переменных без знака, int значения могут использоваться там, где OpenGL ожидает значения без знака, если используется только половина доступного диапазона (т.Е. Самый старший бит равен 0). Поэтому, если вы придерживаетесь int индексов, вам нужно будет использовать GL_UNSIGNED_INT в качестве аргумента.

Счетчик (2-й аргумент), который вы передаете вызову draw, также выглядит очень подозрительно, хотя мы не видим соответствующих определений. Значение должно быть 3 , поскольку вы рисуете 3 вершины, и WIDTH*HEIGHT*2 не может быть 3, по крайней мере, до тех пор, пока WIDTH и HEIGHT являются целыми числами.

Исправляя обе эти проблемы, ваш вызов draw должен выглядеть следующим образом:

 glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
 

Кстати, glPushMatrix() glPopMatrix() вызовы and здесь избыточны, поскольку вы не применяете никаких преобразований.

Комментарии:

1. Спасибо, я постараюсь обновить эти изменения. На самом деле не дошло до того, чтобы изменить преобразование: D