我在使用glDrawArrays时创建了一个正确绘制的顶点缓冲区,但它们无法加载到VBO中。这是代码:
FloatBuffer circleBuffer = ByteBuffer.allocateDirect(numVertices * 3 *
4).order(ByteOrder.nativeOrder()).asFloatBuffer();
for (int j = 0; j < numVertices; j++) {
circleBuffer.put((float) (Math.cos(theta)));
circleBuffer.put((float) (Math.sin(theta)));
circleBuffer.put(1);
theta += 2 * Math.PI / (numVertices);
}
int[] buffer = new int[1];
int circleIndex=0;
gl11.glGenBuffers(1, buffer,0);
circleIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, circleIndex);
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, circleBuffer.capacity() * 4,
circleBuffer, GL11.GL_STATIC_DRAW);
我输出了缓冲区的容量,它是105,剩下的是0.我还尝试将FloatBuffer重新分配为缓冲区。这有什么不对?谢谢!
ERROR/AndroidRuntime(7127): java.lang.IllegalArgumentException: remaining() < size
ERROR/AndroidRuntime(7127): at com.google.android.gles_jni.GLImpl.glBufferData(Native Method)
编辑 - 解决方案
buffer.flip();
答案 0 :(得分:0)
应该由不喜欢其参数的方法故意抛出的Java异常。它扩展了RuntimeException,这意味着它不需要被捕获。 尽管有单数名称,但可以表示更多参数之间不满足的约束。您使用和检查参数越多,您在方法调用中正确地移动异常的次数就越多。 在许多情况下,抛出NullPointerException的代码应该是参数检查并抛出它,并附带一个不错的解释性消息。