Opengl lwjgl绘图元素数组

Opengl lwjgl绘图元素数组,opengl,draw,lwjgl,Opengl,Draw,Lwjgl,在大约3小时的时间里,我试图使用GLDrawerElement函数绘制简单的3d三角形,但似乎我做了一些不正确的事情,我就是这样做的: 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]=

在大约3小时的时间里,我试图使用GLDrawerElement函数绘制简单的3d三角形,但似乎我做了一些不正确的事情,我就是这样做的:

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();
这是绘图的代码 当我直接绘制它而不传递索引时,它就工作了,但它不是这样工作的。
我希望有人能告诉我这段代码有什么问题。

这里有几个问题。首先,OpenGL中的索引是基于0的。因此,与此相反:

tris[0]=3;
tris[1]=2;
tris[2]=1;
你需要这个:

tris[0]=2;
tris[1]=1;
tris[2]=0;
然后,
GL\u INT
不是作为第三个参数传递给
GL抽屉元素()
的有效索引类型。唯一有效的类型是
GL\u UNSIGNED\u BYTE
GL\u UNSIGNED\u SHORT
GL\u UNSIGNED\u INT
。虽然Java没有无符号变量类型,但只要只使用了可用范围的一半(即最高有效位为0),就可以在OpenGL需要无符号值的情况下使用
int
值。因此,如果您坚持使用
int
索引,则需要使用
GL\u UNSIGNED\u int
作为参数

传递给draw调用的count(第二个参数)看起来也很可疑,尽管我们没有看到相应的定义。值应该是
3
,因为您正在绘制3个顶点,
WIDTH*HEIGHT*2
不能是3,至少只要
WIDTH
HEIGHT
是整数

纠正这两个问题后,draw调用应如下所示:

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);

顺便说一句,此处的
glPushMatrix()
glPopMatrix()
调用是多余的,因为您没有应用任何转换。

谢谢,我将尝试使用这些更改进行更新。真的没有达到改变的关键:D