glDrawArrays缓冲区在JOGL中不起作用

时间:2014-11-09 13:15:33

标签: opengl jogl

我想知道是否有人可以帮我找出为什么我的JOGL代码没有显示三角形。出于某种原因没有例外。我错过了什么吗?

    IntBuffer vacantNameBuffer = IntBuffer.allocate(3);
    gl.glGenBuffers(1, vacantNameBuffer);
        int vertexBufferName = vacantNameBuffer.get();
    float[] triangleArray = {
            -1.0f, -1.0f, 0.0f,
            1.0f, -1.0f, 0.0f,
            0.0f, 1.0f, 0.0f
    };

    FloatBuffer triangleVertexBuffer = FloatBuffer.wrap(triangleArray);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vacantNameBuffer.get());
    gl.glBufferData(
            GL2.GL_ARRAY_BUFFER, 
            triangleVertexBuffer.capacity() * Buffers.SIZEOF_FLOAT, 
            triangleVertexBuffer, 
            GL2.GL_STATIC_DRAW);
    gl.glEnableVertexAttribArray(vacantNameBuffer.get());
    gl.glVertexAttribPointer(0, 3, GL2.GL_FLOAT, false, 0, 0);
    gl.glDrawArrays(GL2.GL_TRIANGLES, 0, 3);
    gl.glDisableVertexAttribArray(vacantNameBuffer.get());
    gl.glFlush();

2 个答案:

答案 0 :(得分:1)

glEnableVertexAttribArray需要属性位置(您设置为glVertexAttribPointer的第一个参数的数字),因此您应将其更改为:

gl.glEnableVertexAttribArray(0);
gl.glVertexAttribPointer(0, 3, GL2.GL_FLOAT, false, 0, 0);
gl.glDrawArrays(GL2.GL_TRIANGLES, 0, 3);
gl.glDisableVertexAttribArray(0);

答案 1 :(得分:0)

正如在@ ratchet_freak的回答中已经提到的,需要更改glEnableVertexAttribArray()glDisableVertexAttribArray()的参数以传递属性的位置:

gl.glEnableVertexAttribArray(0);
...
gl.glDisableVertexAttribArray(0);

除此之外,您在使用缓冲区对象方面遇到了一些问题。您有多次这些类型的呼叫:

vacantNameBuffer.get()

get()是相对get方法,它获取当前缓冲区位置的值,然后前进位置。因此,如果不重置缓冲区位置,它只会在您第一次进行此调用时为您提供缓冲区中的第一个值。

您已经有一个获取第一个值的语句,并将其存储在变量中:

int vertexBufferName = vacantNameBuffer.get();

您需要做的就是在其余代码中使用此值,而不是再次调用get()。所以改变这个电话:

gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vacantNameBuffer.get());

到此:

gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vertexBufferName);

另一种选择是使用get(0),它会为您提供绝对位置的值。