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