我正在使用顶点缓冲区:
private FloatBuffer vertexBuffer;
private float vertices[] =
{
1.00f, 0.02f, -1.00f,
1.00f, 0.02f, 1.00f,
-1.00f, 0.02f, 1.00f,
-1.00f, 0.02f, -1.00f,
1.00f, 2.02f, -1.00f,
1.00f, 2.02f, 1.00f,
-1.00f, 2.02f, 1.00f,
-1.00f, 2.02f, -1.00f
....
....
};
private byte indices[] =
{
46, 0, 2,
3, 1, 47,
44, 2, 4,
5, 3, 45
...
}
ByteBuffer vbb = ByteBuffer.allocateDirect( vertices.length * 4 );
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position( 0 );
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
问题是当我想要定义一个超过255个顶点的模型时,我显然遇到了编译错误。为了能够定义数千个顶点的模型,我该怎么办?
我得到的错误:
错误:(609,26)错误:可能会丢失精度 必需:字节 发现:int
答案 0 :(得分:1)
gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
GL10.GL_UNSIGNED_BYTE
从0到255,所以正如您所说,您无法获得更高的索引。
但您可以使用GL10.GL_UNSIGNED_SHORT
(从0到65535,长度为2个字节)。
然后,使用IntBuffer
代替索引。
答案 1 :(得分:1)
private byte indices[]=...
如果您需要高于255的值,请不要使用byte
类型.OpenGL ES 2.0支持索引数组的8位和16位类型,因此在单个绘制调用中最多可以引用65536个不同的顶点。如果您需要更多,则需要将其拆分为多个数组。
请注意,很多设备也可能支持32位索引,但规范并不要求这样做。它由OES_element_index_uint
扩展