我想知道是否有人可以帮我找出为什么我的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();
答案 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)
,它会为您提供绝对位置的值。