【问题标题】:lwjgl draw element arraylwjgl 绘制元素数组
【发布时间】:2014-06-28 14:46:28
【问题描述】:

大约 3 小时,我正在尝试使用 glDrawElement 函数绘制简单的 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 draw lwjgl


    【解决方案1】:

    这里有几个问题。首先,OpenGL 中的索引是从 0 开始的。所以不要这样:

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

    你需要这个:

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

    那么,GL_INT 不是作为第三个参数传递给glDrawElements() 的有效索引类型。唯一有效的类型是 GL_UNSIGNED_BYTEGL_UNSIGNED_SHORTGL_UNSIGNED_INT。虽然 Java 没有无符号变量类型,但 int 值可以用于 OpenGL 期望无符号值的地方,只要只使用可用范围的一半(即最高有效位为 0)。因此,如果您坚持使用 int 索引,则需要使用 GL_UNSIGNED_INT 作为参数。

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

    纠正这两个问题,您的绘图调用应如下所示:

    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);
    

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

    【讨论】:

    • 谢谢,我会尝试更新这些更改。真的没有到改变变换的地步:D
    猜你喜欢
    • 2016-10-12
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多